自建Hadoop集群遷移到EMR之?dāng)?shù)據(jù)遷移篇
自建集群要遷移到EMR集群,往往需要遷移已有數(shù)據(jù)。本文主要介紹hdfs數(shù)據(jù)和hive meta數(shù)據(jù)如何遷移。
前置
已按需求創(chuàng)建好EMR集群。
遷移hdfs數(shù)據(jù)
主要依靠distcp,核心是打通網(wǎng)絡(luò),確定hdfs參數(shù)和要遷移內(nèi)容,測速,遷移。
網(wǎng)絡(luò)
需要自建集群和EMR各個(gè)節(jié)點(diǎn)網(wǎng)絡(luò)互通。同為VPC網(wǎng)絡(luò)只需要同一個(gè)安全組,不同的安全組需要設(shè)置安全組互通。
如果自建集群是經(jīng)典網(wǎng)絡(luò),EMR集群是vpc,網(wǎng)絡(luò)訪問需要設(shè)置CLASSICLINK.參見文檔,詳情可以咨詢ECS客服。
設(shè)置后可以在新集群節(jié)點(diǎn)上ssh 老集群節(jié)點(diǎn)確定網(wǎng)絡(luò)連通情況,distcp操作如果有xx 節(jié)點(diǎn)無法連接xx節(jié)點(diǎn)的異常,說明沒有連通,需要繼續(xù)設(shè)置。
hdfs權(quán)限配置確認(rèn)
hdfs有權(quán)限設(shè)置,確定老集群是否有acl規(guī)則,是否要同步,檢查dfs.permissions.enabled 和dfs.namenode.acls.enabled的配置新老集群是否一致,按照實(shí)際需要修改。
如果有acl規(guī)則要同步,distcp參數(shù)要加-p同步權(quán)限參數(shù)。如果distcp操作提示xx集群不支持acl,說明對應(yīng)集群沒配置。新集群沒配置可以修改配置并重啟NM。舊集群不支持,說明舊集群根本就沒有acl方面的設(shè)置,也不需要同步。
同步參數(shù)
一般在新集群上運(yùn)行同步,這樣同步的作業(yè)可以在新集群上運(yùn)行,對老集群影響較小。
distcp參數(shù)細(xì)節(jié),一般命令格式如下:
- hadoop distcp -Ddfs.replication=3 -pbugpcax -m 1000 -bandwidth 30 hdfs://oldclusterip:8020 /user/hive/warehouse /user/hive/
注意事項(xiàng):
hdfs://oldclusterip:8020寫老集群nameode ip,多個(gè)namenode寫當(dāng)前active的。
指定了副本數(shù)3,如想保留原有副本數(shù)-p后加r如-prbugpcax。如果不同步權(quán)限和acl,-p后去掉p和a。
-m指定map數(shù),和集群規(guī)模,數(shù)據(jù)量有關(guān)。比如集群有2000核cpu,就可以指定2000個(gè)map。 -bandwidth指定單個(gè)map的同步速度,是靠控制副本復(fù)制速度實(shí)現(xiàn)的,是大概值。
- 遷移整體速度受集群間帶寬,集群規(guī)模影響。同時(shí)文件越多,checksum需要的時(shí)間越長。如果遷移數(shù)據(jù)量大,可以先試著同步幾個(gè)目錄評估一下整體時(shí)間。如果只能在指定時(shí)間段內(nèi)同步,可以將目錄切為幾個(gè)小目錄,依次同步。
- 如果遷移過程中老集群還有寫入,可以用-udpate再將變化同步過來。
- 一般完全同步,需要有個(gè)短暫的業(yè)務(wù)停寫,以啟用雙寫雙算或直接將業(yè)務(wù)切換到新集群上。
hive meta數(shù)據(jù)同步
hive meta數(shù)據(jù)同步,本質(zhì)是hive meta db,一般是mysql db的數(shù)據(jù)同步。和一般的mysql數(shù)據(jù)同步相比,要注意location改變,和hive版本對齊。
meta db設(shè)置
meta數(shù)據(jù)較多時(shí),一般推薦用rds作為meta db。自建集群可能已有一個(gè)rds db,由于location不同,一般需要新建一個(gè)數(shù)據(jù)庫。***實(shí)踐是跟EMR集群在一個(gè)可用區(qū),一個(gè)vpc 安全組下新建一個(gè)rds 數(shù)據(jù)庫。
登錄新集群master節(jié)點(diǎn)(如果是ha集群兩個(gè)master都需要),修改/usr/local/emr/emr-agent/run/meta_db_info.json,把里面的use_local_meta_db設(shè)置為false,meta數(shù)據(jù)庫信息的鏈接地址、用戶名和密碼換成新建rds的信息。然后重啟hive組件的metaserver。
初始化meta的表信息:
- ···
- cd /usr/lib/hive-current/bin
- ./schematool - initSchema -dbType mysql
- ···
location
hive的表,分區(qū)等信息是有l(wèi)ocation信息的,帶dfs nameservices前綴,如hdfs://mycluster:8020/,而EMR集群的nameservices前綴是統(tǒng)一的emr-cluster,所以需要訂正。訂正的***方式是先導(dǎo)出數(shù)據(jù)mysqldump --databases hivemeta --single-transaction -u root –p > hive_databases.sql,用sed替換hdfs://oldcluster:8020/為hdfs://emr-cluster/ ,再導(dǎo)入新db中。
- mysql hivemeta -p < hive_databases.sql
版本對齊
EMR的hive版本一般是當(dāng)前社區(qū)***的穩(wěn)定版,自建集群hive版本可能會更老,所以導(dǎo)入的舊版本數(shù)據(jù)可能不能直接使用。需要執(zhí)行hive的升級腳本,地址。例如hive從1.2升級到2.3.0,需要依次執(zhí)行upgrade-1.2.0-to-2.0.0.mysql.sql,upgrade-2.0.0-to-2.1.0.mysql.sql,upgrade-2.1.0-to-2.2.0.mysql.sql,upgrade-2.2.0-to-2.3.0.mysql.sql。腳本主要是建表,加字段,改內(nèi)容,如有表已存在,字段已存在的異??梢院雎?。
驗(yàn)證
meta數(shù)據(jù)全部訂正后,就可以重啟metaserver了。命令行hive,查詢庫和表,查詢數(shù)據(jù),驗(yàn)證正確性。