數(shù)據(jù)遷移 往往 是數(shù)據(jù)運(yùn)維經(jīng)常會(huì)用到的事情粥烁,就像 pc重裝電腦,把C盤的文件轉(zhuǎn)移到E盤一樣蝇棉,不過 數(shù)據(jù)遷移 在生產(chǎn)環(huán)境當(dāng)中往往是 跨網(wǎng)絡(luò) 跨集群 傳輸 文件讨阻,要保證文件不丟失 不亂碼 不重復(fù) ,文件的完整統(tǒng)一篡殷。
【順便需要解決 一下 pid 的存儲(chǔ)路徑钝吮,不然集群長(zhǎng)時(shí)間 久了 突然停止,會(huì)停止不下來板辽,報(bào) 找不到 NameNode 和DataNode】
http://blog.csdn.net/gyqjn/article/details/50805472
hadoop 集群數(shù)據(jù) 的特點(diǎn)是 量大 分塊 有副本 奇瘦, 集群的穩(wěn)定性 和配置高可用 機(jī)器 硬件性能 和網(wǎng)絡(luò)帶寬 stream 流讀取等等都是考驗(yàn)。
hadoop 如果使用 get 把文件加載到本地劲弦,再通過scp 去傳耳标,不光步驟繁瑣 ,小文件量大邑跪,在加上編寫腳本容易出錯(cuò) 不易調(diào)試 次坡,集群不在同一內(nèi)網(wǎng),傳輸 速率和穩(wěn)定性都無法保證画畅。hadoop自然有一個(gè)自己的工具 :Distcp .砸琅。假如 沒有Distcp 想想 管理大數(shù)據(jù) 簡(jiǎn)直會(huì)是一個(gè)噩夢(mèng)。
Distcp 的強(qiáng)大在于 簡(jiǎn)潔 可配置 傳輸穩(wěn)定 原生支持 錯(cuò)誤可以排查 等等轴踱,可以說是數(shù)據(jù)算法 及數(shù)據(jù)運(yùn)維的福音症脂。
當(dāng)然 Distcp 很強(qiáng)大 ,也很傲嬌,稍微不留意就會(huì)出現(xiàn) 小脾氣和公主病摊腋,在倒騰 Distcp 的兩周內(nèi)沸版,我也算吃了不少苦頭嘁傀,各種報(bào)錯(cuò)兴蒸,簡(jiǎn)直不能忍,差一點(diǎn)就要放棄了细办,還是送我一片光陰 橙凳。嘗到小甜頭后,又繼續(xù)報(bào)錯(cuò) 被虐的體無完膚笑撞,在最后的堅(jiān)持下岛啸,提著頭 抱著再解決不了干脆就離職跑路吧。但還是 強(qiáng)給自己信心茴肥。告訴自己沒有踏不過坎都是紙老虎坚踩。
最終 克服重重困難 找到了 最終答案,回頭一看瓤狐,又氣又惱瞬铸,按道理是簡(jiǎn)單,可是找到寶藏 藏寶圖不止一張础锐,也只有不斷的嘗試后嗓节,才確認(rèn)了最后的結(jié)果的正確性。
好了皆警,言歸正傳拦宣,Distcp 支持 三種 協(xié)議 hdfs hftp webhdfs ,支持集群內(nèi)部 拷貝信姓,集群間拷貝 鸵隧,跨版本集群間拷貝。源和目標(biāo)可以是目錄 或者是文件 意推,支持 overwrite 和update豆瘫,Distcp 的執(zhí)行 其實(shí)是mapreduce。
在使用 Distcp 左痢,集群內(nèi)部 src 源文件路徑和dist 目標(biāo)路徑 都可以使用 hdfs 協(xié)議靡羡,例如
hadoop Distcp hdfs://master:9000/linkge/1020log.txt hdfs://master:9000/linkactive/1020log.txt
在集群間 數(shù)據(jù)遷移 ,單個(gè) 文件 俊性,需要在目標(biāo)集群上操作略步,src源需要使用hftp 協(xié)議 默認(rèn)端口 50070 ,dist 目標(biāo)使用hdfs 協(xié)議 默認(rèn)端口 9000 或者8020定页,
例如
hadoop distcp hftp://52.83.67.242:50070/linkpage/201707/01/01/biz.log.22.snappy hdfs://linkhadoop-master:9000/linkpage/201707/01/01/biz.log.22.snappy
單個(gè)目錄也可以使用 此方式
hadoop distcp hftp://52.80.67.242:50070/linkpage/201707/01 hdfs://linkhadoop-master:9000/linkpage/201707/01
不過 對(duì)于擁有多個(gè)大文件的單個(gè)目錄來說趟薄,使用hftp 協(xié)議傳輸 會(huì)報(bào)一些錯(cuò)誤 ,好像是hadoop 2.x 自帶的老bug
這些錯(cuò)誤包括socket read time out 和 文件 讀寫和文件大小不統(tǒng)一
`
Caused by: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.net.SocketTimeoutException: Read timed out
Caused by: java.net.SocketTimeoutException: Read timed out
Caused by: org.apache.hadoop.tools.mapred.RetriableFileCopyCommand$CopyReadException: java.io.IOException: Got EOF but currentPos = 1900544 < filelength = 3461794346
at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.readBytes(RetriableFileCopyCommand.java:290)
at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.copyBytes(RetriableFileCopyCommand.java:258)
at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.copyToFile(RetriableFileCopyCommand.java:183)
at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doCopy(RetriableFileCopyCommand.java:123)
at org.apache.hadoop.tools.mapred.RetriableFileCopyCommand.doExecute(RetriableFileCopyCommand.java:99)
at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:87)
`
這些錯(cuò)其實(shí)并不能說明是src 集群 文件是有問題的典徊,所以 經(jīng)過多次 嘗試 仍然無法解決杭煎,多個(gè)文件傳輸 仍有 70%的文件傳輸失敗恩够。
這個(gè)問題 最終在 Google一個(gè)非常難查到的網(wǎng)頁找到了微弱的聲音,當(dāng)看到頁面 有一個(gè) solved 羡铲,真是百感交集蜂桶。
https://community.cloudera.com/t5/Storage-Random-Access-HDFS/Handling-Distcp-of-large-files-between-2-clusters/td-p/42470
有人 跟帖告訴大家使用 webhdfs 協(xié)議可以幾乎完美的解決這個(gè)問題,數(shù)據(jù)總算是可以愉快的傳輸了也切。
例如
hadoop distcp webhdfs://52.82.67.242:50070/linkpage/201708 hdfs://linkhadoop-master:9000/linkpage/201708
剛才說的 這些 是在使用的Distcp 終極答案扑媚。其中在使用Distcp 中途還遇到了 其他的攔路鬼,
比如報(bào) 在 src 集群 的DataNode無法找到相應(yīng)的文件雷恃,
這個(gè) 一般來說src 集群本身的問題疆股, 比如說 集群 中各個(gè)節(jié)點(diǎn)有沒有設(shè)置 主機(jī)名,每個(gè)DataNode 節(jié)點(diǎn) 是否 在/etc/hosts 配置了 所有src DataNode NameNode的 節(jié)點(diǎn) 的私有ip 與主機(jī)名及dist 目標(biāo)集群 的DataNode NameNode 節(jié)點(diǎn)的公有ip 和主機(jī)名倒槐,而且 dist 目標(biāo)集群也要 做類似配置旬痹。要配置 ssh免登陸,NameNode ssh免登陸到DataNode上讨越,配置一下 hadoop 各個(gè)節(jié)點(diǎn) 守護(hù)進(jìn)程 的pid 目錄两残,配置 hadoop 用戶 下的 ~/.bashrc 文件中的環(huán)境變量,重啟集群試試
還有其他的 socket 連接 時(shí)間超時(shí)谎痢,懷疑可能是 網(wǎng)絡(luò)帶寬磕昼,還有讀大文件的異常,很有可能是 內(nèi)存小 硬盤性能問題等等节猿。如果可以做配置更改也是很不錯(cuò)的票从。
另外 我們要有能力定位問題 ,查找問題 滨嘱,搜索答案 峰鄙,解決問題。驗(yàn)證問題 驗(yàn)證解決方案太雨。
比如我們?cè)谑褂?Distcp 傳輸?shù)臅r(shí)候時(shí)吟榴,先小數(shù)據(jù)集 驗(yàn)證,
比如定位到一個(gè)文件 囊扳,多次傳輸 吩翻,觀察 傳輸?shù)姆€(wěn)定性,和傳輸后的文件大小和行數(shù)锥咸,
再 單目錄 傳輸狭瞎,觀察 目錄文件的數(shù)量是否一致,文件的大小是否一致搏予,量多的話熊锭,選擇抽查 部分文件 查看行數(shù)是否一致。也可以通過 head tail命令查看 前后十行文件內(nèi)容是否一致
源集群 抽查 部分文件行數(shù)
目標(biāo)集群抽查相同的部分文件行數(shù)
通過抽查驗(yàn)證,發(fā)現(xiàn) 完全一致碗殷,所以可以應(yīng)用到真實(shí)的生產(chǎn)環(huán)境實(shí)施了精绎。
我們通過嘗試 從亞馬遜 AWS EC2的hadoop 集群到 阿里云的 linux 集群,傳輸 一天日志 壓縮后80G锌妻,使用Distcp 耗時(shí) 20分鐘代乃,
然后我們生產(chǎn)環(huán)境中單月傳輸,估算大概需要7小時(shí)到-10小時(shí)从祝,襟己,所以需要轉(zhuǎn)后臺(tái)進(jìn)程 執(zhí)行 add &&&&
hadoop distcp webhdfs://52.82.67.242:50070/linkpage/201708 hdfs://linkhadoop-master:9000/linkpage/201708 &
本來還想為阿里云的DataNode 節(jié)點(diǎn)增加寬帶 帶寬,想加快速度牍陌,但是在阿里云的控制臺(tái) 監(jiān)控 竟然公網(wǎng)的使用時(shí)400kb,太詭異员咽,真不曉得這數(shù)據(jù)是如何如此快速傳輸過來的毒涧。
20分鐘 傳一天 80Gb,按道理來說還是可以的贝室,索性就放棄了增加寬帶契讲。