一篇文章徹底掌握 Hdfs 跨叢集跨版本資料同步工具 Hadoop Disctp
大家好,我是明哥!
最近有小夥伴問到 hadoop distcp 的使用,對其中的一些細節和容易踩的坑不是很清楚,所以今天我們來看下 hadoop distcp 的原理,細節和容易踩的坑。
1 DistCp 概述
我們知道大資料叢集內部都有節點級別和機架級別的容錯機制(儲存層對應的就是傳統的三副本或糾刪碼機制),但對於一些資料安全性要求更改的場景,比如在金融行業典型的兩地三中心場景下,經常有跨區域跨叢集災備的需求,此時就會涉及到跨叢集的資料同步。
DistCp (distributed copy) 就是一款跨叢集的資料同步工具。
DistCp 可以用來做 hdfs 叢集內部或叢集之間的大規模的資料同步,由於在底層使用了 MapReduce 框架會通過多個 mapper 來拷貝需要拷貝的檔案列表,其效能相比 hdfs dfs -get/put 等通過本地檔案系統中轉的資料同步方案,要高效快速很多。
同時由於 DistCp 可以跨 hdfs 大版本進行資料同步,且新版本的 DistCp(distcp version 2) 相比老版本的DistCp(legacy DistCp,version 1.2.1)在很多方面都做了優化和改進,所以大規模的資料同步,不論是叢集內部還是叢集之間,首選的方案都是DistCp。
很多商業的hdfs資料同步方案,其底層都是原生的 DistCp,比如 cdh 的 bdr 工具,比如 tdh 的 backup工具,其原理都是如此。
2 關於叢集間資料同步
- 叢集間資料同步,可以從原叢集推送資料到目標叢集,此時會為會佔用原叢集 yarn 中的資源;
- 叢集間資料同步,也可以從目標叢集發起作業,主動拉取原叢集的資料,此時消耗的是目標叢集的YARN資源;
- 如果原叢集是生產叢集,一般在目標叢集執行命令hadoop distcp來發起作業,通過拉的方式來同步資料,此時不會消耗原叢集即生產叢集的YARN資源;
- 當原叢集和目標叢集大版本不同時,(比如在 hadoop 1.x 跟 hadoop 2.x 之間同步資料),需要使用 webhdfs 協議,即通過以下格式指定遠端叢集:webhdfs:// :;(當然,既可以從原叢集推資料,也可以從目標叢集拉資料);
- 當原叢集和目標叢集大版本相同時,(比如都是 hadoop 2.x或都是hadoop 3.x),推薦使用 hdfs 協議,此時效能比 webhdfs 更好;
- 如果 webhdfs 配置了 SSL 加密,則需要使用協議 “swebhdfs://” ;
3 關於開啟了 kerberos 安全認證後的資料同步
- 如果原叢集和目標叢集都啟用了kerberos認證 (hadoop.security.authentication=kerberos),需要首先做 kerberos 的 realm 互信,然後才能通過推或拉的方式執行 dictcp 進行資料同步;
- 如果原叢集與目標叢集一個啟用了kerberos認證,另一個沒有啟用kerberos認證,為簡單起見,可以在啟用了kerberos認證的叢集中執行distCp,通過推或拉的方式進行資料同步;
4 DistCp 的底層工作機制
新版 DistCp 底層有以下元件,其各自的職責如下:
- DistCp Driver:負責解析 DistCp 的命令列引數,並編排協調具體的拷貝任務(首先呼叫 copy-listing-generator 獲得需拷貝的檔案列表,然後配置並提交 Map-Reduce 拷貝任務,最後根據配置項返回 MR 任務控制代碼並推出,或等待 MR任務執行結束;)
- Copy-listing generator:負責解析給定的 source-paths(目錄或檔案,可以包含萬用字元),生成待拷貝的檔案/目錄列表,並輸出到一個 SequenceFile;
- Input-formats 和 Map-Reduce:負責讀取 Copy-listing generator 生成的 SequenceFile 中的待烤包的檔案列表,並執行實際的檔案拷貝;
5 DistCp 的重要引數講解
DistCp 提供了多種引數,來控制拷貝任務的各種細節,經常使用到的關鍵引數有 -update, -delete, -overwrite, -m, -bandwidth,-diff,-p,-i 等:
- -m:控制 map 任務的最大個數;(實際的 map 任務數,不會大於待拷貝的檔案的個數;更多的 map 數不一定會提升整體IO吞吐);
- -bandwidth:控制每個 map 任務可用的最大頻寬,單位 MB;
- -p[rbugpcaxt]:控制是否保留原始檔的屬性,rbugpcaxt 分別指:replication number, block size, user, group, permission,checksum-type, acl, xattr,以及 tiemstamp;
- skipcrccheck:控制檢查源和目標檔案差異以生成待拷貝檔案列表時,是否跳過 CRC 校驗;
- update: 如果源和目標目錄下的檔案,在 檔案大小/塊大小/checksum 上有不同,就用;
- -update: 拷貝目標目錄下不存在而源目錄下存在的檔案,或目標目錄下和源目錄在檔案大小/塊大小/checksum 上不同的檔案;
- -overwrite: 覆蓋目標目錄下的同名檔案。(如果某個 map 任務執行失敗且沒有指定 -i 引數,則所有的待拷貝的檔案,包括拷貝失敗的檔案,都會被重新拷貝);
- -i: 忽略拷貝過程中某些 MAP 任務的錯誤,繼續執行其餘的 map拷貝任務,而不是直接失敗整個作業;(預設情況下,如果有某個 map 任務失敗的次數達到了 mapreduce.map.maxattempts,則未完成的 map 任務都會被 kill;);
- -delete: 刪除目標目錄下存在,但源目錄下不存在的檔案;該引數只能和 -update 或 -overwrite 配合使用;
- -diff 和 -rdiff:控制是否結合使用快照機制,會基於兩個快照的差異(snapshot diff)來確定待拷貝的檔案列表,以下要點需要注意:
- -diff 和 -rdiff,需要配合選項 -update 一起使用;
- -diff 和 -rdiff,不能和 -delete 一起使用,否則會報錯:java.lang.IllegalArgumentException: -delete and -diff/-rdiff are mutually exclusive. The -delete option will be ignored;
- 該命令的前提條件:需要源目錄下有指定的兩個快照 from_snapshot 和 to_snapshot;
- 該命令的前提條件:需要目標目錄下有快照 from_snapshot;
- 該命令的前提條件:需要目標目錄在前期製作了 from_snapshot 快照後,沒有新的檔案寫操作 (create, rename, delete);
- 該命令執行完畢後,目標目錄下並不會自動建立快照 to_snapshot,如果後續還需要基於快照來做增量同步,需要手工在同步完畢後對目標目錄製作快照 to_snapshot,為後續基於快照的同步(hadoop distcp -diff -update)做好準備;
6 易踩的坑 - skipcrccheck
- 引數 -skipcrccheck 的意思是 “Whether to skip CRC checks between source and target paths.”,即是否跳過原路徑和目標路徑下檔案的 crc 校驗(CRC:Cyclic Redundancy Check)。
- 如果指定了該引數,會跳過crc校驗,同步作業速度會快些;
- 但指定該引數後,由於不校驗 crc,而是通過檔名和檔案大小來發現哪些檔案需要進行同步,在極端情況下,可能會漏掉某些需要同步的小檔案,比如某些只有少數幾條記錄的小檔案,從而造成資料不一致;
- 下圖展示的就是,某兩個 hive orc 表都只有1條記錄,對應的 HDFS 檔案也比較小且都是 299 BYTE, 指定引數 skipcrccheck 執行同步操作時,就遺漏了該檔案,造成了源目錄與目標目錄資料的不一致:“sudo -u hdfs hadoop distcp -update -delete -skipcrccheck -pugpb hdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scp hdfs://nameservice1/user/hive/warehouse/hs_liming.db/test_single_row_scp2“:
skipcrccheck 的坑-hdfs
skipcrccheck 的坑-hive sql
7 關於 hive 的跨叢集資料同步
- 關於 hive的跨叢集資料同步,hive 社群在推動 hive replication 的方案,但因為該方案的各種前提和限制,目前該方案在業界採用的比較少;
- 市面上採用的較多的hive的跨叢集資料同步,是對hive的元資料和資料分別進行資料同步;
- 對於 hive 資料的同步,本質上就是對於底層 hdfs 資料的同步,可以採用上述hdfs的distcp方案;
- 對於hive元資料的同步,本質上就是對底層 metastore db,如 mysql/posggresql 等rdbms中的資料的同步,可以採用成熟的 mysqldump 和 source方案。
8 常用命令總結
- 執行資料同步操作時,需要停止對目標目錄的其它寫操作;
- 當沒有對原目錄的寫操作時(即停止了對源目錄的寫操作),可以使用以下命令來跨叢集同步資料:hadoop distcp -delete -update -pugpb -m 10 -bandwidth 5 hdfs://xx.xx/ hdfs://yy.yy/
- 當有對原目錄的寫操作時(即有對原目錄的併發寫操作),需要結合快照機制來同步資料:hadoop distcp -diff-update -pugpb
- 結合快照機制來同步資料時,有以下前提要求:
- 需要源目錄下有指定的兩個快照 from_snapshot 和 to_snapshot;
- 需要目標目錄下有快照 from_snapshot;
- 需要目標目錄在前期製作了 from_snapshot 快照後,沒有新的檔案寫操作如 create/rename/delete (即要求目標目錄的當前狀態跟原目錄的from-snapshot一致);
- 該命令執行完畢後,目標目錄下並不會自動建立快照 to_snapshot,如果後續還需要基於快照來做增量同步,需要手工在同步完畢後對目標目錄製作快照 to_snapshot,為後續基於快照的同步(hadoop distcp -diff -update)做好準
- 學習型程式設計師養成錄:高能六招讓你工作學習兩不誤!
- 金融科技十大技術趨勢出爐,這兩項技術關注度飆升!
- 周鴻禕:不理解“拋棄” 35 歲程式設計師,網友:裝糊塗
- 我以訂披薩為例,給女朋友詳細講了Java設計模式的3種工廠模式
- 面向初學者的物聯網開發工具:開始開發物聯網的六種工具
- 2022年網路安全趨勢:7個趨熱,2個趨冷
- 十二個 Vue 開發中的效能優化小技巧
- 二十一 個 JavaScript 迴圈遍歷方法,你都知道嗎?
- HarmonyOS 屬性動畫擴充套件
- 用 Python 機器學習預測黃金價格
- 爆爆:Java程式碼編譯流程是怎樣的?
- 你可能不知道但卻很有用的 Java 特性
- 數字經濟時代,運營商錨定科技創新優化升級數字基礎設施
- 電腦裝哪個系統好,win7還是win10?看完這個就知道了
- 看一遍就理解:Group By詳解
- 訪問資料庫總超時?這份避坑指南請收好
- 滲透測試101:道德黑客入門指南
- 全面預算並不難,FONE Planning輕鬆落地企業戰略與執行
- 大名鼎鼎的程序排程就是從這裡開始的
- 私有鏈不是"雞肋",它存在的價值是什麼?