官术网_书友最值得收藏!

4.4.1 讀取數據

FileSystem是HDFS Java API的核心工具類,該類是一個抽象類,其中封裝了很多操作文件的方法,使用這些方法可以很輕松地操作HDFS中的文件。例如,在HDFS文件系統的根目錄下有一個文件file.txt,可以直接使用FileSystem API讀取該文件內容,具體操作步驟如下。

1. 編寫程序

在新建的hdfs_demo項目中新建Java類FileSystemCat.java,寫入查詢顯示HDFS中的/file.txt文件內容的代碼,代碼編寫步驟如下:

 創建Configuration對象。

 得到FileSystem對象。

 進行文件操作。完整代碼如下所示:

代碼分析:

? 在運行HDFS程序之前,需要先初始化Configuration對象,該對象的主要作用是讀取HDFS的系統配置信息,也就是安裝Hadoop時候的配置文件,例如core-site.xml、hdfs-site.xml、mapred-site.xml等文件。

? FileSystem是一個普通的文件系統API,可以使用靜態工廠方法取得FileSystem實例,并傳入Configuration對象參數。FileSystem類的繼承結構如圖4-9所示。

圖4-9 FileSystem類的繼承結構

? 通過調用FileSystem對象的open()方法,取得文件的輸入流。該方法實際上返回的是一個FSDataInputStream對象,而不是標準的java.io類對象。FSDataInputStream類是繼承了java.io.DataInputStream類的一個特殊類,支持隨機訪問,因此可以從流的任意位置讀取數據。FSDataInputStream類的主要作用是使用DataInputStream包裝一個輸入流,并且使用BufferedInputStream實現對輸入的緩沖。FSDataInputStream類的部分定義源碼如下:

FSDataInputStream類的繼承結構如圖4-10所示。

圖4-10 FSDataInputStream類的繼承結構

2. 運行程序

直接在Eclipse中右鍵單擊代碼空白處,選擇【Run As】/【Java Application】運行該程序即可,若控制臺中能正確輸出文件file.txt的內容,說明代碼編寫正確。

當然,也可以將項目導出為jar包,然后上傳jar包到Hadoop集群的任意一個節點上,執行以下命令運行該程序:

上述命令需要到$HADOOP_HOME/bin目錄中執行,若配置了該目錄的系統PATH變量,則可以在任意目錄執行。其中的hdfs_demo.jar為項目導出的jar包名稱,此處為相對路徑,hdfs.demo為類FileSystemCat所在的包名。

4.4.2 創建目錄

使用FileSystem的創建目錄方法mkdirs(),可以創建未存在的父目錄,就像java.io.File的mkdirs()方法一樣。如果目錄創建成功,它會返回true。

下面這個例子是在HDFS文件系統根目錄下創建一個名為mydir的文件夾。

1. 編寫程序

在新建的hdfs_demo項目中新建Java類CreateDir.java,該類的完整代碼如下所示:

2. 運行程序

代碼的運行參考4.4.1節,若控制臺中能正確輸出“創建目錄成功!”,說明代碼編寫正確。

4.4.3 創建文件

使用FileSystem的創建文件方法create(),可以在HDFS文件系統的指定路徑創建一個文件,并向其寫入內容。例如,在HDFS系統根目錄創建一個文件newfile2.txt,并寫入內容“我是文件內容”,代碼如下:

代碼分析:

? FileSystem實例的create()方法返回一個文件輸出流對象FSDataOutputStream,該類繼承了java.io.DataOutputStream類。與FSDataInputStream類不同的是,FSDataOutputStream類不支持隨機訪問,因此不能從文件的任意位置寫入數據,只能從文件末尾追加數據。

create()方法有多個重載方法,允許指定是否強制覆蓋已有文件(默認覆蓋)、文件副本數量、寫入文件的緩沖大小、文件塊大小、文件權限許可等。create()方法的其中幾個重載方法的定義源碼如下:

在調用create()方法時,還可以傳入一個Progressable對象,該Progressable是一個接口,其中定義了一個progress()回調方法,使用該方法可以得知數據被寫入數據節點的進度。Progressable接口的源碼如下:

例如,上傳文件D:/soft/test.zip到HDFS根目錄,并通過在控制臺打印“.”顯示上傳進度,代碼如下:

運行上述代碼,當每次上傳64 KB數據包到Hadoop數據節點時將調用一次progress()方法。

此外,還可以使用FileSystem的append()方法在文件末尾追加數據。這對于日志文件需要持續寫入數據非常有用。append()方法的調用源碼如下:

4.4.4 刪除文件

使用FileSystem的deleteOnExit()方法,可以對HDFS文件系統中已經存在的文件進行刪除。例如,刪除HDFS系統根目錄下的文件newfile.txt,代碼如下:

4.4.5 遍歷文件和目錄

使用FileSystem的listStatus()方法,可以對HDFS文件系統中指定路徑下的所有目錄和文件進行遍歷。例如,遞歸遍歷HDFS系統根目錄下的所有文件和目錄并輸出路徑信息,代碼如下:

上述代碼通過調用FileSystem的listStatus()方法獲得指定路徑下的一級子目錄及文件,并將結果存儲于FileStatus類型的數組中;然后循環遍歷該數組,當遇到目錄時,再次調用listStatus()方法取得該目錄下的所有子目錄及文件,從而能夠遞歸取得指定路徑下的所有目錄及文件。

假設HDFS文件系統的根目錄有文件夾input、文件newfile.txt,文件夾input中有文件test.txt,則上述代碼的輸出結果為:

4.4.6 獲取文件或目錄的元數據

使用FileSystem的getFileStatus ()方法,可以獲得HDFS文件系統中的文件或目錄的元數據信息,包括文件路徑、文件修改日期、文件上次訪問日期、文件長度、文件備份數、文件大小等。getFileStatus ()方法返回一個FileStatus對象,元數據信息則封裝在了該對象中。

獲取文件或目錄元數據的代碼如下:

上述代碼的輸出結果如下:

4.4.7 上傳本地文件

使用FileSystem的copyFromLocalFile()方法,可以將操作系統本地的文件上傳到HDFS文件系統中,該方法需要傳入兩個Path類型的參數,分別代表本地目錄/文件和HDFS目錄/文件。

例如,將Windows系統中D盤的copy_test.txt文件上傳到HDFS文件系統的根目錄,代碼如下:

4.4.8 下載文件到本地

使用FileSystem的copyToLocalFile()方法,可以將HDFS文件系統中的文件下載到操作系統本地,該方法需要傳入兩個Path類型的參數,分別代表HDFS目錄/文件和本地目錄/文件。例如,將HDFS文件系統根目錄的文件newfile2.txt下載到Windows系統中D盤根目錄,并重命名為new.txt,代碼如下:

主站蜘蛛池模板: 岢岚县| 新闻| 海盐县| 东丽区| 漳州市| 眉山市| 美姑县| 石泉县| 皋兰县| 渭南市| 西畴县| 图片| 三都| 德庆县| 淮安市| 诸暨市| 昂仁县| 老河口市| 如东县| 扎囊县| 博爱县| 屯留县| 普宁市| 河曲县| 台东县| 鄱阳县| 米林县| 丰台区| 老河口市| 兰考县| 敦煌市| 尚义县| 嵊州市| 江山市| 濉溪县| 龙口市| 正安县| 新河县| 丰城市| 溆浦县| 内黄县|