Hadoop源生实用工具之distcp
1 概覽
DistCp(Distributed Copy)是用于大規模集群內部或者集群之間的高性能拷貝工具。 它使用Map/Reduce實現文件分發,錯誤處理和恢復,以及報告生成。 它把文件和目錄的列表作為map任務的輸入,每個任務會完成源列表中部分文件的拷貝
備注:在工作中遇到部門間數據合作,夸不同集群版本或者同版本不同集群的數據copy是不同的。
2 實用
總體來說分兩類:
1) 同版本集群間數據copy ;
2)?夸集群版本數據copy;
?同版本集群間數據copy?
比如:拷貝A集群(nn1的IP192.168.7.120)的A目錄到B集群(nn2的IP192.168.8.120)的B1目錄
1 hadoop distcp hdfs://192.168.7.120:8020/cluster/A/ hdfs://192.168.8.120:8020/cluster/B1/小結:
a) 使用hdfs協議,其中192.168.7.120是A集群的namenode地址, 8020是A集群的rpc端口(hdfs-site.xml中可查看)。192.168.8.120是B集群的namenode IP地址
b) 這條命令會將A集群中的/A文件夾以及文件夾下的文件復制到B集群中的/B1目錄下,即在B集群中會以/B1/A的目錄結構出現。如果/B1目錄不存在,則系統會新建一個。需要注意的是,源路徑必須是絕對路徑。包含前面的hdfs://ip:port
添加多個數據源,指定多個源目錄 如:
1 hadoop distcp hdfs: 2 3 //192.168.7.120:8020/cluster/A/a1 hdfs://192.168.7.120:8020/A/a2 hdfs://192.168.8.120:8020/cluster/B1/或者使用-f選項,從文件里獲得多個源:
hadoop distcp -f hdfs://192.168.7.120:8020/src_A_list hdfs://192.168.8.120:8020/cluster/B1/其中src_A_list 的內容是
? ? hdfs://192.168.7.120:8020/cluster/A/a1
? ? hdfs://192.168.7.120:8020/cluster/A/a2
當從多個源拷貝時,如果兩個源沖突,distcp會停止拷貝并提示出錯信息, 如果在目的位置發生沖突,會根據選項設置解決。 默認情況會跳過已經存在的目標文件(c處說明;比如不用源文件做替換操作)。每次操作結束時 都會報告跳過的文件數目,但是如果某些拷貝操作失敗了,但在之后的嘗試成功了, 那么報告的信息可能不夠精確。
每個JobTracker必須都能夠與源端和目的端文件系統進行訪問和交互。
拷貝完成后,建議生成源端和目的端文件的列表,并交叉檢查,來確認拷貝真正成功。 因為distcp使用Map/Reduce和文件系統API進行操作,所以這三者或它們之間有任何問題 可能影響拷貝。
值得注意的是,當另一個客戶端同時在向源文件寫入時,拷貝很有可能會失敗。 嘗試覆蓋HDFS上正在被寫入的文件的操作也會失敗。 如果一個源文件在拷貝之前被移動或刪除了,拷貝失敗同時輸出異常 FileNotFoundException。
c) 默認情況下,雖然distcp會跳過在目標路徑上已經存在的文件,但是通過-overwirte選項可以選擇對這些文件進行覆蓋重寫,也可以使用,-update選項僅對更新過的文件進行重寫。
實戰案例:
案例要求 從/cluster/A1/ 和 /cluster/A2/ 到 /cluster/B1的拷貝,源路徑包括:hdfs://192.168.7.120:8020/cluster/A1hdfs://192.168.7.120:8020/cluster/A1/a1hdfs://192.168.7.120:8020/cluster/A1/a2hdfs://192.168.7.120:8020/cluster/A2hdfs://192.168.7.120:8020/cluster/A2/a3hdfs://192.168.7.120:8020/cluster/A2/a1如果沒設置-update或 -overwrite選項, 那么兩個源都會映射到目標端的 /cluster/B1/A1A2。 如果設置了這兩個選項,每個源目錄的內容都會和目標目錄的 內容 做比較。distcp碰到這類沖突的情況會終止操作并退出。默認情況下,/cluster/B1/A1 和 /cluster/B1/A2 目錄都會被創建,所以并不會有沖突。現在講-update用法: distcp -update hdfs://192.168.7.120:8020/cluster/A1 \ hdfs://192.168.7.120:8020/cluster/A2 \ hdfs://192.168.8.120:8020/cluster/B1 其中源路徑/大小:hdfs://192.168.7.120:8020/cluster/A1 hdfs://192.168.7.120:8020/cluster/A1/a1 32 hdfs://192.168.7.120:8020/cluster/A1/a2 64 hdfs://192.168.7.120:8020/cluster/A2 hdfs://192.168.7.120:8020/cluster/A2/a3 64 hdfs://192.168.7.120:8020/cluster/A2/a4 32 和目的路徑/大小:hdfs://192.168.8.120:8020/cluster/B1 hdfs://192.168.8.120:8020/cluster/B1/a1 32 hdfs://192.168.8.120:8020/cluster/B1/a2 32 hdfs://192.168.8.120:8020/cluster/B1/a3 128 會產生:hdfs://192.168.8.120:8020/cluster/B1 hdfs://192.168.8.120:8020/cluster/B1/a1 32 hdfs://192.168.8.120:8020/cluster/B1/a2 32 hdfs://192.168.8.120:8020/cluster/B1/a3 64hdfs://192.168.8.120:8020/cluster/A2/a4 32 發現部分192.168.8.120的a2文件沒有被覆蓋(a3卻覆蓋)。如果指定了 -overwrite選項,所有文件都會被覆蓋。
d) distcp操作有很多選項可以設置,比如忽略失敗、限制文件或者復制的數據量等。直接輸入指令或者不附加選項則可以查看此操作的使用說明。
附件distcp可以選配的參數:
夸集群版本數據copy
?
hadoop distcp hftp://192.168.7.120:50070/cluster/A/ hdfs://192.168.8.120:8020/cluster/B1
需要注意的是,要定義訪問源的URI中NameNode的網絡接口,這個接口會通過dfs.namenode.http-address的屬性值設定,默認值為50070 ,參考hdfs-site.xml:
?
3 實戰出現的問題總結
a)ipc.StandbyException : //s.apache.org/sbnn-error
?
?
解決:
Dfs所鏈接的namenode的狀態不是active的 處于standby狀態不予鏈接,所以方法:換一個namenode, 保證新的namenode是active
?
b)???java.io.IOException:Check-sum mismatch?
分析:該問題很常見,能在網上查到,是因為不同版本hadoop 的checksum版本不同,老版本用crc32,新版本用crc32c;
解決:只要在distcp時增加兩個參數(-skipcrccheck -update),忽略crc檢查即可。注意-skipcrccheck參數要與-update同時使用才生效。
?c)?java.net.UnknowHostException
?
原因分析:圖中可以看到,distcp job已經啟動了,map 0%,? 但是報了UnknowHostException:pslaves55,可能的原因是在從datanode取數據時,用的是host pslave55, 而這個host是數據源集群特有的,目標集群不識別,所以報UnknowHostException.
解決辦法:在目標集群中配置hosts文件,將數據源集群中所有的host和ip的對應關系追加到目標集群中的hosts文件中,使得目標集群在訪問host名時(如pslave55)能成功映射到ip
4?總結
要實現跨集群拷貝,如拷貝A集群的數據到B集群,需要確認以下事情:
(1)確認B集群機器都能ping通A集群所有ip。
(2) 用的port 響應在各自節點上放開 iptables 不要“攔住”
(3)如果部門間的端口防火墻已經開通,但還是telnet不同,請確認A集群的iptables已經加入了B集群ip。
(4)如果在B集群有UnknowHostException,則需要將A集群的host與ip映射關系追加到B集群的hosts文件中。
附上常用端口port 對照:
其他配置參考官方:
http://hadoop.apache.org/docs/r2.7.6/hadoop-distcp/DistCp.html
?
轉載于:https://www.cnblogs.com/jagel-95/p/10945317.html
總結
以上是生活随笔為你收集整理的Hadoop源生实用工具之distcp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 显示器尺寸对照表_电脑显示器尺寸对照表(
- 下一篇: Apple Watch 7 显示屏尺寸和