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