Hadoop 集群間使用DistCp同步數(shù)據(jù)(高可用)-相同版本

Hadoop 集群間使用DistCp同步數(shù)據(jù)(高可用)-相同版本

版本:Hadoop2.7.7

一、關(guān)于集群間數(shù)據(jù)同步

  1. 集群間數(shù)據(jù)同步,可以從原集群推送數(shù)據(jù)到目標集群,此時會為會占用原集群 yarn 中的資源;
  2. 集群間數(shù)據(jù)同步,也可以從目標集群發(fā)起作業(yè),主動拉取原集群的數(shù)據(jù),此時消耗的是目標集群的YARN資源;
  3. 如果原集群是生產(chǎn)集群,一般在目標集群執(zhí)行命令hadoop distcp來發(fā)起作業(yè),通過拉的方式來同步數(shù)據(jù),此時不會消耗原集群即生產(chǎn)集群的YARN資源;
  4. 當原集群和目標集群大版本不同時,(比如在 hadoop 1.x 跟 hadoop 2.x 之間同步數(shù)據(jù)),需要使用 webhdfs 協(xié)議,即通過以下格式指定遠端集群:webhdfs://<namenode_hostname>:<http_port>;(當然,既可以從原集群推數(shù)據(jù),也可以從目標集群拉數(shù)據(jù));
  5. 當原集群和目標集群大版本相同時,(比如都是 hadoop 2.x或都是hadoop 3.x),推薦使用 hdfs 協(xié)議,此時性能比 webhdfs 更好;
  6. 如果 webhdfs 配置了 SSL 加密,則需要使用協(xié)議 “swebhdfs://” ;

二、前提條件:

  1. 源集群和目標集群的 NameNode 都是高可用的,且在不同的服務器上運行。
  2. 源集群和目標集群都已經(jīng)安裝了 Hadoop,并配置了相應的參數(shù)和組件,例如 HDFS、YARN、MapReduce 等。
  3. 遷移之前需要把兩個集群的所有節(jié)點都互通/etc/hosts文件(重要,包括各個數(shù)據(jù)節(jié)點)
  4. 源集群和目標集群之間的網(wǎng)絡連接可靠,且支持 SSH 和 RPC 等通信協(xié)議。同時需要確保端口號設置和防火墻策略等安全措施符合要求
  5. 在進行數(shù)據(jù)復制和同步操作前,應該進行一次充分的測試,并檢查日志和錯誤信息,以確保操作的正確性和完整性。
  6. 由于遷移數(shù)據(jù)運行了mr任務,對集群資源有一定的消耗。

具體的端口:

使用 DistCp 工具進行 Hadoop 集群之間的數(shù)據(jù)復制和同步,需要保證以下端口的互通:

  1. HDFS 端口:DistCp 使用 HDFS 協(xié)議來讀取和寫入數(shù)據(jù),因此需要確保 HDFS 端口在不同的集群之間可用,并允許相應的數(shù)據(jù)傳輸操作。
    • 默認為 8020(NameNode RPC 端口)或者 9000(HDFS 系統(tǒng)文件對外訪問端口)
  2. SSH 端口:默認情況下,DistCp 通過 SSH 遠程執(zhí)行復制任務。這意味著,在兩個集群之間復制數(shù)據(jù)需要確保 SSH 端口的可用性和連接權(quán)限設置。
    • 默認為 22。
  3. MapReduce 端口:如果要使用兼容模式進行數(shù)據(jù)復制和同步,則還需要確保 MapReduce 端口在兩個集群之間可用,并允許相應的作業(yè)提交和執(zhí)行操作。
    • MapReduce 的每個組件都有不同的端口,其中 JobTracker 和 TaskTracker 組件使用的端口如下,默認情況下 JobTracker 端口為 54311,TaskTracker 端口為 50060

因此,在使用 DistCp 工具進行 Hadoop 集群之間的數(shù)據(jù)復制和同步操作時,需要確保以上端口的互通和設置,以避免因網(wǎng)絡連接或配置不當而導致的數(shù)據(jù)傳輸失敗或異常

四、關(guān)于開啟了 kerberos 安全認證后的數(shù)據(jù)同步

  1. 如果原集群和目標集群都啟用了kerberos認證 (hadoop.security.authentication=kerberos),需要首先做 kerberos 的 realm 互信,然后才能通過推或拉的方式執(zhí)行 dictcp 進行數(shù)據(jù)同步;

  2. 如果原集群與目標集群一個啟用了kerberos認證,另一個沒有啟用kerberos認證,為簡單起見,可以在啟用了kerberos認證的集群中執(zhí)行distCp,通過推或拉的方式進行數(shù)據(jù)同步;

五、具體命令:

如果兩個 Hadoop 集群的 NameNode 都是高可用的,可以使用 DistCp 命令進行數(shù)據(jù)復制和同步。具體命令如下:

hadoop distcp [OPTIONS] <srcurl> <desturl>

其中,[OPTIONS] 是可選的參數(shù),<srcurl><desturl> 分別是源和目標文件系統(tǒng)的 URL。

假設源集群名稱為 src_cluster,目標集群名稱為 dst_cluster,則可以使用以下命令復制源集群中的數(shù)據(jù)到目標集群:

hadoop distcp -update -skipcrccheck -delete -bandwidth 50 -m 100 -mapredSudo hdfs://src_cluster/user/hadoop/example hdfs://dst_cluster/user/hadoop/backup

命令中使用了以下參數(shù):

  • -update:只復制更新時間較新的文件;
  • -skipcrccheck:跳過 CRC 校驗;
  • -delete:刪除目標集群中比源集群中舊或不存在的文件或目錄;
  • -bandwidth 50:限制最大帶寬,以避免過多的網(wǎng)絡流量阻塞;
  • -m 100:設置最大 mapper 數(shù)量;
  • -mapredSudo:啟用兼容模式。

六、集群名稱之間識別配置:

在使用 DistCp 進行跨集群數(shù)據(jù)復制和同步時,需要確保源集群和目標集群之間可以相互訪問并識別。通常情況下,需要在源集群和目標集群的 Hadoop 配置文件中進行相應的配置,以便于兩個集群之間建立連接。

具體來說,可以將目標集群的 NameNode 或 ResourceManager 的 IP 地址和端口號添加到源集群的 core-site.xmlhdfs-site.xml 配置文件中。例如,在源集群中添加目標集群的 NameNode 地址和端口號的配置如下:

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://src_cluster:8020,hdfs://dst_cluster:8020</value> 
</property>

<property>
  <name>dfs.namenode.rpc-address.dst_cluster</name>
  <value>node2:8020</value>
</property>

<property>
  <name>yarn.resourcemanager.hostname.dst_cluster</name>
  <value>node2</value>
</property>

上述示例中,

  1. fs.defaultFS 屬性為源集群和目標集群的 NameNode URL。

  2. dfs.namenode.rpc-address.dst_cluster 屬性指定了目標集群的 NameNode 地址和端口號。

  3. yarn.resourcemanager.hostname.dst_cluster 屬性則指定了目標集群的 ResourceManager 主機名。這些參數(shù)可以根據(jù)實際情況進行相應的修改和調(diào)整。

  4. 在配置好集群之后,可以通過 hdfs dfsadmin -report 命令來檢查 HDFS 的狀態(tài),并查看集群是否能夠正常運行并連通。

  5. 如果所有組件都正常啟動,則可以使用 DistCp 命令進行跨集群數(shù)據(jù)復制和同步操作。

七、DistCp優(yōu)勢特性

  1. 帶寬限流
  • DistCp是支持帶寬限流的,使用者可以通過命令參數(shù)bandwidth來為程序進行限流,原理類似于HDFS中數(shù)據(jù)Balance程序的限流.
  1. 增量數(shù)據(jù)同步
  • 對于增量數(shù)據(jù)同步的需求,在DistCp中也得到了很好的實現(xiàn).通過update,append 和 diff 2個參數(shù)能很好的解決.官方的參數(shù)使用說明:

Update: Update target, copying only missing files or directories

Append: Reuse existing data in target files and append new data to them if possible.

Diff: Use snapshot diff report to identify the difference between source and target.

第一個參數(shù),解決了新增文件目錄的同步;第二參數(shù),解決已存在文件的增量更新同步;第三個參數(shù)解決刪除或重命名文件的同步.

這里需要額外解釋一下diff的使用需要設置2個不同時間的snapshot進行對比,產(chǎn)生相應的DiffInfo.在獲取快照文件的變化時,只會選擇出DELETE和RENAME這2種類型的變化信息。

  1. 高效的性能
  • 執(zhí)行的分布式特性

  • 高效的MR組件

八、DistCp 的底層工作機制

新版 DistCp 底層有以下組件,其各自的職責如下:

  1. DistCp Driver:負責解析 DistCp 的命令行參數(shù),并編排協(xié)調(diào)具體的拷貝任務(首先調(diào)用 copy-listing-generator 獲得需拷貝的文件列表,然后配置并提交 Map-Reduce 拷貝任務,最后根據(jù)配置項返回 MR 任務句柄并推出,或等待 MR任務執(zhí)行結(jié)束;)

  2. Copy-listing generator:負責解析給定的 source-paths(目錄或文件,可以包含通配符),生成待拷貝的文件/目錄列表,并輸出到一個 SequenceFile;

  3. Input-formats 和 Map-Reduce:負責讀取 Copy-listing generator 生成的 SequenceFile 中的待烤包的文件列表,并執(zhí)行實際的文件拷貝;

九、DistCp 的重要參數(shù)講解

DistCp 提供了多種參數(shù),來控制拷貝任務的各種細節(jié),經(jīng)常使用到的關(guān)鍵參數(shù)有 -update, -delete, -overwrite, -m, -bandwidth,-diff,-p,-i 等:

  • -m <num_maps>:控制 map 任務的最大個數(shù);(實際的 map 任務數(shù),不會大于待拷貝的文件的個數(shù);更多的 map 數(shù)不一定會提升整體IO吞吐);

  • -bandwidth:控制每個 map 任務可用的最大帶寬,單位 MB;

  • -p[rbugpcaxt]:控制是否保留源文件的屬性,rbugpcaxt 分別指:replication number, block size, user, group, permission,checksum-type, acl, xattr,以及 tiemstamp;

  • -skipcrccheck:控制檢查源和目標文件差異以生成待拷貝文件列表時,是否跳過 CRC 校驗;

  • -update: 拷貝目標目錄下不存在而源目錄下存在的文件,或目標目錄下和源目錄在文件大小/塊大小/checksum 上不同的文件;

  • -overwrite: 覆蓋目標目錄下的同名文件。(如果某個 map 任務執(zhí)行失敗且沒有指定 -i 參數(shù),則所有的待拷貝的文件,包括拷貝失敗的文件,都會被重新拷貝);

  • -i: 忽略拷貝過程中某些 MAP 任務的錯誤,繼續(xù)執(zhí)行其余的 map拷貝任務,而不是直接失敗整個作業(yè);(默認情況下,如果有某個 map 任務失敗的次數(shù)達到了 mapreduce.map.maxattempts,則未完成的 map 任務都會被 kill;);

  • -delete: 刪除目標目錄下存在,但源目錄下不存在的文件;該參數(shù)只能和 -update 或 -overwrite 配合使用;

    • -diff 和 -rdiff:控制是否結(jié)合使用快照機制,會基于兩個快照的差異(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);

    • 該命令執(zhí)行完畢后,目標目錄下并不會自動創(chuàng)建快照 to_snapshot,如果后續(xù)還需要基于快照來做增量同步,需要手工在同步完畢后對目標目錄制作快照 to_snapshot,為后續(xù)基于快照的同步(hadoop distcp -diff -update)做好準備;

十、易踩的坑 - skipcrccheck

  • 參數(shù) -skipcrccheck 的意思是 “Whether to skip CRC checks between source and target paths.”,即是否跳過原路徑和目標路徑下文件的 crc 校驗(CRC:Cyclic Redundancy Check)。

  • 如果指定了該參數(shù),會跳過crc校驗,同步作業(yè)速度會快些;

  • 但指定該參數(shù)后,由于不校驗 crc,而是通過文件名和文件大小來發(fā)現(xiàn)哪些文件需要進行同步,在極端情況下,可能會漏掉某些需要同步的小文件,比如某些只有少數(shù)幾條記錄的小文件,從而造成數(shù)據(jù)不一致;

某兩個 hive orc 表都只有1條記錄,對應的 HDFS 文件也比較小且都是 154 BYTE, 指定參數(shù) skipcrccheck 執(zhí)行同步操作時,就遺漏了該文件,造成了源目錄與目標目錄數(shù)據(jù)的不一致:“sudo -u hdfs hadoop distcp -update -delete -skipcrccheck -pugpb hdfs://cluster/user/hive/warehouse/vin_vin.db/test_user_scp hdfs://cluster/user/hive/warehouse/vin_vin.db/test_user_scp2“:

十一、常用命令總結(jié)

  1. 執(zhí)行數(shù)據(jù)同步操作時,需要停止對目標目錄的其它寫操作;
  2. 當沒有對原目錄的寫操作時(即停止了對源目錄的寫操作),可以使用以下命令來跨集群同步數(shù)據(jù):hadoop distcp -delete -update -pugpb -m 10 -bandwidth 5 hdfs://xx.xx/ hdfs://yy.yy/
  3. 當有對原目錄的寫操作時(即有對原目錄的并發(fā)寫操作),需要結(jié)合快照機制來同步數(shù)據(jù):hadoop distcp -diff <from_snapshot> <to_snapshot> -update -pugpb
  4. 結(jié)合快照機制來同步數(shù)據(jù)時,有以下前提要求:
  5. 需要源目錄下有指定的兩個快照 from_snapshot 和 to_snapshot;
  6. 需要目標目錄下有快照 from_snapshot;
  7. 需要目標目錄在前期制作了 from_snapshot 快照后,沒有新的文件寫操作如 create/rename/delete (即要求目標目錄的當前狀態(tài)跟原目錄的from-snapshot一致);
  8. 該命令執(zhí)行完畢后,目標目錄下并不會自動創(chuàng)建快照 to_snapshot,如果后續(xù)還需要基于快照來做增量同步,需要手工在同步完畢后對目標目錄制作快照 to_snapshot,為后續(xù)基于快照的同步(hadoop distcp -diff -update)做好準備;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容