日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDFS文件操作

發布時間:2025/4/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDFS文件操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HDFS是一種文件系統,專為MapReduce這類框架下的大規模分布式數據處理而設計。你可以把一個大數據集(比如說100TB)在HDFS中存儲為單個文件,而大多數其他的文件系統無力實現這一點。HDFS使你不必考慮這些細節,讓你感覺就像在處理單個文件一樣。

因為HDFS并不是一個天生的Unix文件系統,不支持像ls和cp這種標準的Unix文件命令,也不支持如fopen()和fread()這樣的標準文件讀寫操作。另一方面,Hadoop確也提供了一套與linux文件命令類似的命令行工具。
注意 一個典型的Hadoop工作流會在別的地方生成數據庫文件(如日志文件)再將其復制到HDFS中。接著由MapReduce程序處理這個數據,但它們通常不會直接讀任何一個HDFS文件。相反,它們依靠MapReduce框架來讀取HDFS文件,并將之解析為獨立的記錄(鍵值對),這些記錄才是MapReduce程序所處理的數據單元。除非需要定制數據的導入與導出,否則你幾乎不必編程來讀寫HDFS文件。

基本文件命令

Hadoop的文件命令采取的形式為

hadoop fs -cmd <args>

其中cmd是具體的文件命令,而是一組數目可變的命令參數cmd命令通常與UNIX對應的命令名相同。例如,文件列表命令為

hadoop fs -ls

讓我們來看看在Hadoop中最常用文件管理任務,其中包括
添加文件和目錄
獲取文件
刪除文件

指定文件盒目錄確切位置的URI

Hadoop的文件命令既可以與HDFS文件系統交互,也可以和本地文件系統交互。URI精確地定位到一個特定文件或目錄的位置。完整的URI格式為scheme://authority/path。Scheme類似于一個協議。它可以是hdfs或file,來分別指定HDFS文件系統或本地文件系統。對于HDFS,authority是NameNode的主機名,而path是文件或目錄的路徑。例如,對于在本地機器的9000端口號上,以標準偽分布式模型運行的HDFS,訪問用戶目錄user/chuck中文件example.txt的URI大致為hdfs://localhost:9000/user/chuck/example.txt.
你可以使用hadoop的cat命令來顯示該文件的內容:
hadoop fs -cat hdfs://localhost:9000/usr/chuck/example.txt
正如我們馬上就會看到的,大多數設置不需要指定URI中的scheme://authority部分。對于本地文件系統,你可能會更喜歡用標準的Unix命令,而不是hadoop文件命令。當在本地文件系統和HDFS之間復制文件時,hadoop中的命令(如put和get)會分別把本地文件系統作為源和目的,而不需要制定scheme為file。對于其他命令,如果未設置URI中scheme://authority,就會采用Hadoop的默認配置。例如,假如conf/core-site.xml文件已經更改為偽分布式配置,則文件中fs.default.name屬性應為

<property><name>fs.default.name</name><value>hdfs://localhost:9000</value> </property>

在此配置下,URIhdfs://localhost:9000/user/chuck/example.txt縮短為/user/chuck/example.txt。顯示文件內容的hadoo cat命令可以寫為hadoop fs -cat example.txt

添加文件和目錄

在運行hadoop程序處理存儲在HDFS上的數據之前,你需要首先把數據放在HDFS上。讓我們假設你已經完成了格式化,并啟動了一個HDFS文件系統(出于學習目的,我們建議使用偽分布式模式的配置。)讓我們創建一個目錄并放入一個文件。
HDFS有一個默認的工作目錄/usr/USER,USER是你的登錄用戶名。你需要用你的用戶名來替換。

hadoop fs -mkdir /user/chuck

hadoop的mkdir命令會自動創建父目錄(如果此前不存在的話),類似于UNIX中使用-p選項的mkdir命令,因此上述命令還會創建/user目錄,讓我們用ls命令對目錄進行檢查:

hadoop fs -ls/

該命令返回根目錄下目錄/user的信息

Found 1 items drwxr-xr-x -chuck supergroup 0 2009-01-14 10:23 /user

如果你想看到所有的子目錄,則可以使用Hadoop的lsr命令,它類似于Unix中打開-r選項的ls:hadoop fs -lsr /
你會看到所有文件和子目錄:

drwxr-xr-x -chuck supergroup 0 2009-01-14 10:23 /user drwxr-xr-x -chuck supergroup 0 2009-01-14 10:23 /user/chuck

既然有了一個工作目錄,我們可以放一個文件進去。在本地文件系統中創建一個名為example.txt的文本文件,用hadoop的命令put將它從本地文件系統復制到HDFS中去。

hadoop fs -put example.txt.

注意上面的這個命令最后一個參數是句點(.)。這意味著我們把文件放入了默認的工作目錄。該命令等價于:

hadoop fs -put example.txt /user/chuck

我們重新執行遞歸列出文件的命令,可以看到新的文件被添加到HDFS中。

$hadoop fs -lsr / drwxr-xr-x -chuck supergroup 0 2009-01-14 10:23 /user drwxr-xr-x -chuck supergroup 0 2009-01-14 11:02 /user/chuck -rw-r--r-- 1 chuck supergroup 264 2009-01-14 11:02 /user/chuck/example.txt

實際上,我們并不需要遞歸地檢查所有文件,而僅限于在我們自己工作目錄中的文件。我們可以通過最簡單的形式來使用Hadoop的ls命令:

$ hadoop fs -ls Found 1 items -rw-r--r-- 1 chuck supergroup 264 2009-01-14 11:02 /user/chuck/exampe.txt

輸出結果顯示出屬性信息,比如權限、所有者、組、文件大小,以及最后修改日期,所有這些都類似于Unix的概念。顯示“1”的列給出文件的復制因子。偽分布式配置下它永遠為1。對于生產環境中的集群,復制因子通常為3,但也可以是任何正整數。因為復制因子不適用于目錄,故屆時該列會顯示一個破折號(-)。
當你把數據放到HDFS上之后,你可以運行Hadoop程序來處理它。處理過程將輸出一組新的HDFS文件,然后你可以讀取或檢索這些結果。

檢索文件

hadoop的get命令與put截然相反。它從HDFS中復制文件到本地文件系統。比方說,我們在本地不再擁有文件example.txt,而想從HDFS中將它取回,我們就可以運行命令:

hadoop fs -get example.txt.
將它復制到我們在本地的當前工作目錄中。
另一種訪問數據的方式是顯示。由hadoop的cat命令來支持:
hadoop fs -cat example.txt
我們可以在Hadoop的文件命令中使用Unix的管道,將其結果發送給其他的Unix命令做進一步處理。例如,如果該文件非常大(正如典型的Hadoop文件那樣),并且你希望快速地檢查其內容,就可以把hadoop中cat命令的輸出用管道傳遞給Unix命令head:
hadoop fs -cat example.txt|head
hadoop內在支持tail命令來查看最后一千字節:
hadoop fs -tail example.txt
文件在HDFS上的任務完成之后,可以考慮刪除它們以釋放空間。

刪除文件

hadoop刪除文件的命令為rm,現在你也許不會感到太驚訝了:
hadoop fs -rm example.txt
rm命令還可以用于刪除空目錄。

編程讀寫HDFS

為了體驗HDFS的Java API,我們將開發一個PutMerge程序,用于合并文件后放入HDFS。命令行工具并不支持這個操作,我們將使用API來實現。
需要分析來自許多Web服務器的Apache日志文件時,就有了建立這個歷程的動機。雖然我們可以把每個日志文件都復制到HDFS中,但通常而言,Hadoop處理單個大文件會比處理許多個小文件更有效率(這里“小”是相對的,因為它仍會達到幾十或幾百GB)。此外,從分析目的來看,我們把日志數據視為一個大文件。日志數據被分散在多個文件是由于Web服務器采用分布式架構所帶來的副作用。一種解決辦法是先將所有的文件合并,然后再復制到HDFS。可是,文件合并需要占用本地計算機的大量磁盤空間。如果我們能夠在向HDFS復制的過程中合并它們,事情就會簡單很多。
因此,我們需要一個PutMerge類型的操作。hadoo命令行中有一個getmerge命令,用于一組HDFS文件在復制到本地以前進行合并。但我們想要的截然相反,故無法再Hadoop的文件管理工具中獲得。我們用HDFS API來自己編程實現它。
在Hadoop中用作文件操作的主流位于org.apache.hadoop.fs軟件包中。Hadoop的基本文件操作包括常見的open、read、write和close。實際上,hadoop的文件API是通用的,可以用于HDFS以外的其他文件系統。對于我們的PutMerge程序,它讀取本地文件系統和寫入HDFS都會使用Hadoop的文件api。

不多說,直接上代碼:

import java.io.IOException;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.eclipse.jdt.internal.compiler.ConfigurableOption;public class PutMerge {public static void main(String[] args) throws IOException{Configuration conf = new Configuration();FileSystem hdfs = FileSystem.get(conf);FileSystem local = FileSystem.getLocal(conf);Path inputDir = new Path(args[0]);//1.設定輸入目錄與輸出文件Path hdfsFile = new Path(args[1]);try{FileStatus[] inputFiles = local.listStatus(inputDir);//2.得到本地文件列表FSDataOutputStream out = hdfs.create(hdfsFile);//3.生成HDFS文件流for (int i = 0; i < inputFiles.length; i++){System.out.println(inputFiles[i].getPath().getName());FSDataInputStream in = local.open(inputFiles[i].getPath());//4.打開本地輸入流byte buffer[] = new byte[256];int bytesRead = 0;while ((bytesRead = in.read(buffer)) > 0){out.write(buffer, 0, bytesRead);}in.close();}out.close();}catch (Exception e){e.printStackTrace();}} }

我們已經討論了如何處理HDFS中的文件,你現在知道一些方法來讀寫HDFS中的數據,但是僅僅有數據還不夠,還要對它進行處理分析以及其他的操作。在后續學習過程中,我們將介紹Hadoop的另一個主要組件——MapReduce框架,看看如何基于它來編程。

轉載于:https://www.cnblogs.com/ainima/p/6331862.html

總結

以上是生活随笔為你收集整理的HDFS文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。