天天看點

自建hadoop叢集遷移到EMR之資料遷移篇前置遷移hdfs資料hive meta資料同步

自建叢集要遷移到EMR叢集,往往需要遷移已有資料。本文主要介紹hdfs資料和hive meta資料如何遷移。

已按需求建立好EMR叢集。

主要依靠distcp,核心是打通網絡,确定hdfs參數和要遷移内容,測速,遷移。

需要自建叢集和EMR各個節點網絡互通。同為VPC網絡隻需要同一個安全組,不同的安全組需要設定安全組互通。

設定後可以在新叢集節點上ssh 老叢集節點确定網絡連通情況,distcp操作如果有xx 節點無法連接配接xx節點的異常,說明沒有連通,需要繼續設定。

hdfs有權限設定,确定老叢集是否有acl規則,是否要同步,檢查dfs.permissions.enabled 和dfs.namenode.acls.enabled的配置新老叢集是否一緻,按照實際需要修改。

如果有acl規則要同步,distcp參數要加-p同步權限參數。如果distcp操作提示xx叢集不支援acl,說明對應叢集沒配置。新叢集沒配置可以修改配置并重新開機NM。舊叢集不支援,說明舊叢集根本就沒有acl方面的設定,也不需要同步。

一般在新叢集上運作同步,這樣同步的作業可以在新叢集上運作,對老叢集影響較小。

<code>hadoop distcp -Ddfs.replication=3 -pbugpcax -m 1000 -bandwidth 30 hdfs://oldclusterip:8020 /user/hive/warehouse /user/hive/</code>

注意事項:

hdfs://oldclusterip:8020寫老叢集nameode ip,多個namenode寫目前active的。

指定了副本數3,如想保留原有副本數-p後加r如-prbugpcax。如果不同步權限和acl,-p後去掉p和a。

-m指定map數,和叢集規模,資料量有關。比如叢集有2000核cpu,就可以指定2000個map。 -bandwidth指定單個map的同步速度,是靠控制副本複制速度實作的,是大概值。

4.遷移整體速度受叢集間帶寬,叢集規模影響。同時檔案越多,checksum需要的時間越長。如果遷移資料量大,可以先試着同步幾個目錄評估一下整體時間。如果隻能在指定時間段内同步,可以将目錄切為幾個小目錄,依次同步。

5.如果遷移過程中老叢集還有寫入,可以用-udpate再将變化同步過來。

6.一般完全同步,需要有個短暫的業務停寫,以啟用雙寫雙算或直接将業務切換到新叢集上。

hive meta資料同步,本質是hive meta db,一般是mysql db的資料同步。和一般的mysql資料同步相比,要注意location改變,和hive版本對齊。

meta資料較多時,一般推薦用rds作為meta db。自建叢集可能已有一個rds db,由于location不同,一般需要建立一個資料庫。最佳實踐是跟EMR叢集在一個可用區,一個vpc 安全組下建立一個rds 資料庫。

登入新叢集master節點(如果是ha叢集兩個master都需要),修改/usr/local/emr/emr-agent/run/meta_db_info.json,把裡面的use_local_meta_db設定為false,meta資料庫資訊的連結位址、使用者名和密碼換成建立rds的資訊。然後重新開機hive元件的metaserver。

初始化meta的表資訊:

···

cd /usr/lib/hive-current/bin

./schematool - initSchema -dbType mysql

hive的表,分區等資訊是有location資訊的,帶dfs nameservices字首,如hdfs://mycluster:8020/,而EMR叢集的nameservices字首是統一的emr-cluster,是以需要訂正。訂正的最佳方式是先導出資料<code>mysqldump --databases hivemeta --single-transaction -u root –p &gt; hive_databases.sql</code>,用sed替換hdfs://oldcluster:8020/為hdfs://emr-cluster/ ,再導入新db中。

<code>mysql hivemeta -p &lt; hive_databases.sql</code>

meta資料全部訂正後,就可以重新開機metaserver了。指令行<code>hive</code>,查詢庫和表,查詢資料,驗證正确性。