您好,登錄后才能下訂單哦!
本篇內容介紹了“如何在HDFS上添加文件和目錄”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
HDFS文件操作
你可以把一個大數據集(100TB)在HDFS中存儲為單個文件,而大多數其他的文件系統無力實現這一點。雖然該文件存在多個副本分布在多臺機器上來支持并行處理,你也不必考慮這些細節。
HDFS (Hadoop Distribution File System)文件系統到底是一個怎樣的文件系統?
并不是一個Unix文件系統,不支持像ls和cp這種標準的Unix文件命令,也不支持如fopen()和fread()這樣的標準文件讀寫操作。但是Hadoop提供了一套與Linux文件命令類似的命令行工具。
一個典型的Hadoop工作流是指?
1、在別的地方生成數據文件(如日志文件)再將其復制到HDFS中。
2、由MapReduce程序處理這個數據,讀取HDFS文件并將之解析為獨立的記錄(鍵/值對)
3、除非要定制數據的導入與導出,否則你幾乎不必編程來讀寫HDFS文件。
Hadoop文件命令采取的形式是?
hadoop fs -cmd <args>
cmd是具體的文件命令,而<args>是一組數目可變的參數。cmd的命名通常與UNIX對應的命令名相同。如,文件列表的命令為:hadoop fs -ls
Hadoop最常用的文件管理任務包括?
1、添加文件和目錄
2、獲取文件
3、刪除文件
Hadoop文件命令可以和本地文件系統交互嗎?
Hadoop的文件命令既可以與HDFS文件系統交互,也可以和本地文件系統交互。
URI定位是指?完整的URL格式是?
URL精確地定位一個特定文件或目錄的位置。
完整的URL格式為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 fs -cat hdfs://localhost:9000/user/chuck/example.txt
但是通常我們在使用Hadoop文件命令時沒有指定URI中的scheme://authority部分
是怎么回事?
是的,大多數設置不需要指定URI中的scheme://authority部分
例如,當在本地文件系統和HDFS之間復制文件時
1、put命令將本地文件復制到HDFS中,源是本地文件,目的是HDFS文件
2、get命令將HDFS中文件復制到本地,源是HDFS文件,目的是本地文件。
如果未設置URI中的scheme://authority部分,就會采用Hadoop的默認配置fs.default.name屬性的配置。
例如:conf/core-site.xml文件配置是:
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
在此配置下,URI hdfs://localhost:9000/user/chuck/example.txt縮短為/user/chuck/example.txt
注:有些更早的文檔以hadoop dfs -cmd <args>的形式表示文件工具。dfs和fs是等價的,但現在都是用fs
HDFS默認當前工作目錄是?
HDFS默認當前工作目錄為/user/$USER,其中$USER是你的登錄用戶名。
例:如果你作為chuck登錄,則URI hdfs://localhost:9000/user/chuck/example.txt就縮短為example.txt。顯示文件內容的Hadoop cat命令可寫為:
hadoop fs -cat example.txt
如何在HDFS上添加文件和目錄?
首先必須確保幾點:
1、必須先進行格式化
2、出于學習目的,建議使用偽分布式
3、默認工作目錄是/user/$USER,但這個目錄不會自動創建,需要手動創建先
手動創建默認工作目錄
hadoop fs -mkdir /user/chuck
Hadoop的mkdir命令會自動創建父目錄,類似于UNIX中使用-p選項的mkdir命令,因此上述命令還會創建/user目錄。
hadoop fs -ls / 該命令列出根目錄下的所有文件和目錄
hadoop fs -lsr / 該命令列出根目錄下所有文件和子目錄
hadoop fs -put example.txt . 將本地文件example.txt放入HDFS中。
后面的(.),意味著把文件放入默認的工作目錄,等價于
hadoop fs -put example.txt /user/chuck
hadoop fs -ls 列出工作目錄下的所有文件和目錄
使用hadoop fs -ls命令列出內容和復制因子
通常情況下會列出如下面這樣的view
Found 1 items
-rw-r--r-- 1 chuck supergroup 264 2009-01-14 11:02 /user/chuck/example.txt
顯示屬性信息,其他的不解釋和UNIX的概念類似。主要說一下"1"列出文件的復制因子。偽分布式下它永遠為1,對于生產環境中的集群,復制因子通常為3,也可以是任何正整數,復制因子不適用于目錄,所以該列會顯示一個(-)
如何檢索文件?
Hadoop的get命令與put命令相反,從HDFS中復制文件到本地文件系統。
比如hadoop fs -get example.txt 將它復制帶本地的當前工作目錄中。
hadoop fs -cat example.txt 也可以使用cat命令顯示數據。
也可以使用管道命令 hadoop fs -cat example.txt | head
可以使用tail命令來查看最后的一千字節:
hadoop fs -tail example.txt
如何刪除文件?
刪除文件和空目錄使用rm命令
hadoop fs -rm example.txt
如何查閱幫助?
hadoop fs (無參數) 來獲取所用版本Hadoop的一個完整命令列表。
hadoop fs -help ls 顯示每個命令的用法及簡短描述。
HDFS的Java API?
雖然,命令行工具足以滿足大多數與HDFS文件系統交互的需求,但是有些需求只能用Java API去訪問,比如開發一個PutMerge程序,用于合并文件后放入HDFS中,命令行工具并不支持這個操作。
合并文件后放入HDFS中,什么時候會這樣做呢?
考慮這樣一個場景,需要分析來自許多Web服務器的Apache日志文件時,就有了建立這個例程的動機,雖然我們可以把每個日志文件都復制到HDFS中,但通常而言,Hadoop處理單個大文件會比處理許多個小文件更有效率。
為什么會日志數據會分散在多個文件?
這是由于Web服務器采用分布式架構所造成的。
一種解決辦法是?為什么不直接合并?
一種解決辦法是先將所有的文件合并,然后再復制到HDFS。可是,文件合并需要占用本地計算機的大量磁盤空間。如果我們能夠在向HDFS復制的過程中合并它們就好了。
Hadoop命令行工具getmerge命令。
getmerge命令,用于把一組HDFS文件在復制到本地計算機之前進行合并,但我們想要的截然相反。我們是要putmerge命令。
Hadoop文件操作API是?
Hadoop中用作文件操作的主類位于org.apache.hadoop.fs軟件包中,Hadoop的基本文件操作包括open、read、write和close,Hadoop的文件API也可以用于HDFS以外的其他文件系統。
Hadoop文件API的起點是FileSystem類,這是一個與文件系統交互的抽象類,存在不同的具體實現子類用于處理HDFS和本地文件系統。你可以通過調用factory方法FileSystem.get(Configuration conf)來得到所需的FileSystem實例。Configuration類是用于保留鍵/值配置參數的特殊類。它的默認實例化方法是以HDFS系統的資源配置為基礎的。
如何得到一個FileSystem對象?
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
要得到一個專用于本地文件系統的FileSystem對象,可以使用factory方法的FileSystem.getLocal(Configuration conf);
FileSystem local = FileSystem.getLocal(conf);
其他說明:
Hadoop文件API使用Path對象來編制文件和目錄名,使用FileStatus對象來存儲文件和目錄的元數據。PutMerge程序將合并一個本地目錄中的所有文件。我們使用FileSystem的listStatus()方法來得到一個目錄中的文件列表:
Path inputDir = new Path(args[0]);
FileStatus[] inputFiles = local.listStatus(inputDir);
數組inputFiles的長度等于指定目錄中的文件個數。在inputFiles中每一個FileStatus對象均有元數據信息,如文件長度、權限、修改時間等。PutMerge程序所關心的是每個文件的Path,即inputFiles[i].getPath()。我們可以通過FSDataInputStream對象訪問這個Path來讀取文件。
FSDataInputStream in = local.open(inputFiles[i].getPath());
byte buffer[] = new byte[256];
int bytesRead = 0;
while ( (bytesRead = in.read(buffer)) > 0) {
...
}
in.close();
FSDataInputStream是Java標準類java.io.DataInputStream的一個子類,增加了對隨機訪問的支持。類似地有一個FSDataOutputStream對象用于將數據寫入HDFS文件:
Path hdfsFile = new Path(args[1]);
FSDataOutputStream out = hdfs.create(hdfsFile);
out.write(buffer, 0, bytesRead);
out.close();
“如何在HDFS上添加文件和目錄”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。