每個檔案hdfs採用塊方式進行儲存,在系統執行時,檔案塊的元資料資訊會被儲存在namenode的記憶體中,因此,對hdfs來說,大規模儲存小檔案顯然是低效的,很多小檔案會耗盡namenode的大部分記憶體。
hadoop歸檔檔案和har檔案可以將檔案高效地放入hdfs塊中的檔案存檔裝置,在減少namenode記憶體使用的同時,仍然允許對檔案進行透明訪問。具體來說,hadoop歸檔檔案可以作為mapreduce的輸入。這裡需要注意的是,小檔案並不會占用太多的磁碟空間,比如設定乙個128mb的檔案塊來儲存1mb的檔案,實際上儲存這個檔案只需要1mb磁碟空間,而不是128mb。
hadoop歸檔檔案是通過archive命令工具根據檔案集合建立的。因為這個工具需要執行乙個mapreduce來並行處理輸入檔案,所以需要乙個執行mapreduce的集群。而hdfs中有些檔案是需要進行歸檔的,例如:
hadoop fs -lsr /user/ubuntu/in/執行archive命令如下:-rw-r--r-- 3 ubuntu\ubuntu supergroup 13
2012-03-18
20:15 /user/ubuntu/in/hello.c.txt
-rw-r--r-- 3 ubuntu\ubuntu supergroup 13
2012-03-17
15:13 /user/ubuntu/in/hello.txt
hadoop archive -archivenamefiles.har /user/ubuntu/in/ /user/ubuntu/
在命令列中,第乙個引數是歸檔檔案的名稱,這裡是file.jar檔案;
第二個引數是要歸檔的檔案源,這裡我們只歸檔乙個源資料夾,即hdfs下/user/ubuntu/in/中的檔案,但事實上,archive命令可以接收多個檔案源;
最後乙個引數,即本例中的/user/ubuntu/是har檔案的輸出目錄。可以看到這個命令的執行流程為乙個mapreduce任務。
下面我們來看這個歸檔檔案是怎麼建立的:
hadoop fs -ls /user/ubuntu/in/ /user/ubuntu/found這個目錄列表展示了乙個har檔案的組成:兩個索引檔案和部分檔案(part file)的集合。這裡的部分檔案包含已經連線在一起的大量原始檔的內容,同時索引檔案可以檢索部分檔案中的歸檔檔案,包括它的長度、起始位置等。但是,這些細節在使用har uri模式訪問har檔案時大多數都是隱藏的。2items
-rw-r--r-- 3 ubuntu\ubuntu supergroup 13
2012-03-18
20:15 /user/ubuntu/in/hello.c.txt
-rw-r--r-- 1 ubuntu\ubuntu supergroup 13
2012-03-17
15:13 /user/ubuntu/in/hello.txt
found
3items
drwxr-xr-x - ubuntu\ubuntu supergroup 0
2012-03-18
20:15 /user/ubuntu/in
drwxr-xr-x - ubuntu\ubuntu supergroup 0
2012-03-18
18:53 /user/ubuntu/ubuntu
drwxr-xr-x - ubuntu\ubuntu supergroup 0
2012-03-18
20:47 /user/ubuntu/files.har
har檔案系統是建立在底層檔案系統之上的(此處是hdfs),以下命令是以遞迴的方式列出了歸檔檔案的檔案:
hadoop fs -lsr har://如果har檔案所在的檔案系統是預設的檔案系統,那麼這裡的內容就非常直觀和易懂,但是,如果你想要在其他檔案系統中使用har檔案,就需要使用不同格式的uri路徑。下面兩個命令具有相同的作用:user/ubuntu/files.har
drw-r--r-- - ubuntu\ubuntu supergroup 0
2012-03-18
20:47 /user/ubuntu/files.har/user
drw-r--r-- - ubuntu\ubuntu supergroup 0
2012-03-18
20:47 /user/ubuntu/files.har/user/ubuntu
drw-r--r-- - ubuntu\ubuntu supergroup 0
2012-03-18
20:47 /user/ubuntu/files.har/user/ubuntu/in
-rw-r--r-- - ubuntu\ubuntu supergroup 0
2012-03-18
20:47 /user/ubuntu/files.har/user/ubuntu/in/hello.c.txt
-rw-r--r-- - ubuntu\ubuntu supergroup 0
2012-03-18
20:47 /user/ubuntu/files.har/user/ubuntu/in/hello.txt
hadoop fs -lsr har:/// user/ubuntufiles.har/my/files/dir
hadoop fs -lsr har://hdfs-localhost:8020/ user/ubuntu/files.har/my/files/dir
第二個命令,它仍然使用har模式描述乙個har檔案系統,但是使用hdfs作為底層的檔案系統模式,har模式之後緊跟乙個hdfs系統的主機和埠號。har檔案系統會將har uri轉換為地產底層的檔案系統fangwenuri。在本例中即為hdfs://localhost:8020/user/ubuntu/archive/files.har,檔案的剩餘部分路徑即為檔案歸檔部分的路徑/my/files/dir。
想要刪除har檔案,需要使用刪除的歸檔格式,這是因為底層的檔案系統har檔案是乙個目錄,刪除命令為hadoop fs -rmr /userubuntu/files.har。
對於har檔案我們還需要了解它的一些不足之處。當建立乙個歸檔檔案時,還會建立原始檔案的乙個副本,這樣就需要額外的磁碟空間(儘管歸檔完成後悔刪除原始檔案)。而且當前沒有針對閨房檔案的壓縮辦法,只能對寫入歸檔檔案的原始檔案進行壓縮。歸檔檔案一旦建立就不能改變,要增加或者刪除檔案,就需要重新建立。事實上,這對於那些寫後不能更改的檔案不構成問題,因為可以按日或者按周進行定期成批歸檔。
如前所述,har檔案可以作為mapredeuce的乙個輸入檔案,然而,沒有乙個基於歸檔的inputformat可以將多個檔案打包到乙個單一的mapreduce中去。所以,即使是har檔案,處理小的檔案時效率仍然不高。
Hadoop的shell操作命令收集
hadoop常用的操作命令 ls 使用方法 hadoop fs ls h r 功能 顯示檔案 目錄資訊。示例 hadoop fs ls user hadoop file1 mkdir 使用方法 hadoop fs mkdir p 功能 在 hdfs 上建立目錄,p 表示會建立路徑中的各級父目錄。示例...
Hadoop的Shell指令碼命令
hadoop fs ls r 功能 顯示檔案 目錄資訊。示例 hadoop fs ls user hadoop file1 hadoop fs mkdir p 功能 在hdfs上建立目錄,p表示會建立路徑中的各級父目錄。示例 hadoop fs mkdir p user hadoop dir1 ha...
hadoop下hdfs的shell命令
列出hadoop中當前使用者的資料目錄 root localhost bin hdfs dfs ls found 2 items drwxr xr x root supergroup 0 2019 01 25 15 24 input1 drwxr xr x root supergroup 0 201...