Distcp
- 用于在兩個多個集群之間進行數(shù)據(jù)的遷移,復(fù)制文件
hadoop distcp hdfs://namenode:9000/user hdfs://namenode:9000/hadoop
1.看了distcp的執(zhí)行結(jié)果你會發(fā)現(xiàn),他其實是個mapreduce任務(wù),但是只有map沒有reduce
- distcp會把文件平均分給map去執(zhí)行,每個文件一個maop 任務(wù),首先會按照文件大小分配,如果大小小于256m糾紛給一個map任務(wù),但是如果大于256m就會平均分配給不同的map任務(wù),一般情況下每個節(jié)點的個數(shù)不會超過20map任務(wù)
- 你可以通過-m手動設(shè)置,如果為了hdfs的均衡,最好是將maps設(shè)的多一些,將block分攤開來。
- 如果兩個集群間的版本不一致,那么使用hdfs可能就會產(chǎn)生錯誤,因為rpc系統(tǒng)不兼容
1.推薦用hftp的替代協(xié)議webhdfs,源地址和目標地址都可以使用webhdfs,可以完全兼容
hadoop distcp webhdfs://namenode:50070/user/hadoop/input webhdfs://namenode:50070/user/hadoop/input1
Archive
- hdfs并不擅長存儲小文件,因為每個文件最少一個block,每個block的元數(shù)據(jù)都會在namenode節(jié)點占用內(nèi)存,如果存在這樣大量的小文件,它們會吃掉namenode節(jié)點的大量內(nèi)存
- hadoop Archives可以使用archive工具創(chuàng)建,同上講的distcp一樣,archive也是一個mapreduce任務(wù)
hadoop archive -archiveName input.har -p /user/hadoop/ input har
archiveName指定archive的文件名,-p代表父目錄,可以把多個目錄文件放到archive里,我們來看下創(chuàng)建好的har文件,input輸入路徑,har輸出路徑
in(/user/hadoop/input/),out(/user/hadoop/har)
- 如果用har uri去訪問的話,這些文件就會隱藏起來,只顯示原文件
hadoop fs -lsr har:///user/hadoop/har/input.har
這個是他的訪問模式
限制
- 創(chuàng)建archive文件要消耗和原文件一樣多的硬盤空間
- archive文件不支持壓縮,盡管archive文件看起來象已經(jīng)被壓縮過了。
- archive文件一旦創(chuàng)建就無法改變,這就意味這你要改一些東西的話,你需要創(chuàng)新創(chuàng)建archive文件
- 雖然解決了namenode的內(nèi)存空間問題,但是在執(zhí)行mapreduce時,會把多個小文件交給同一個mapreduce去split,這樣明顯是低效的解決namenode內(nèi)存的問題可以參照之前的文章中的hdfs federation。(當達到一定閥值時才會去split)
壓縮
- 文件壓縮有兩個好處
1.減少存儲文件所暫用的空間
2.可以提高數(shù)據(jù)的傳輸速度 - 壓縮算法是"空間"和"時間"的轉(zhuǎn)換
- 壓縮格式是否可以被分割,也就是說是否可以支持隨機讀(不用從頭掃描,浪費時間)
壓縮格式是否可以被分割是非常關(guān)鍵的(考慮到他的并發(fā)性)
例子
舉個例子,一個未壓縮的文件有1GB大小,hdfs默認的block大小是64MB,那么這個文件就會被分為16個block作為mapreduce的輸入,每一個單獨使用一個map任務(wù)。如果這個文件是已經(jīng)使用gzip壓縮的呢,如果分成16個塊,每個塊做成一個輸入,顯然是不合適的,因為gzip壓縮流的隨即讀是不可能的。實際上,當mapreduce處理壓縮格式的文件的時候它會認識到這是一個gzip的壓縮文件,而gzip又不支持隨即讀,它就會把16個塊分給一個map去處理,這里就會有很多非本地處理的map任務(wù),整個過程耗費的時間就會相當長。
- 支持分割的格式: bzip2,lzo
1.lzo解壓縮的速度值最快的,但是他的壓縮率是一般的
2.gzip壓縮率是比較高的,各種都比較適中
3.bzip2的壓縮率是最高的,適用于對壓縮速度要求不會是很高
但是對壓縮率要求比較高的時候
4.gzip適用于日志輸入格式