CDH集群架设在虚拟机之上,节点数较少、节点硬件及网络资源受限,同时考虑到后续业务不断壮大的情况,旧集群性能已无法满足需求,迫切需要切换至配置更高的新集群。HDFS上,迁移推荐使用DistCp(分布式拷贝)工具。hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo
/foo/bar目录下的所有文件或目录名展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务, 然后每个TaskTracker分别执行从nn1到nn2的拷贝操作。注意DistCp使用绝对路径进行操作。#!/bin/bash
hive_databases='stg
ods
dm
default'
for db in $hive_databases
do
hive -e "use $db; show tables;" > ./db_tables/${db}_all_tables.txt
cat ${db}_all_tables.txt |while read eachline
do
hive -e "use $db; show create table $eachline;" >>${db}_tablesDDL.sql
done
done
在生成的SQL文件中批量修改path及location指向新集群的namenode
hive> create database stg;
hive> create database ods;
hive> create database dm;
配置好/etc/hosts,保证新旧集群网络已打通。
#!/bin/bash
hive_databases='stg
ods
dm
default'
for db in $hive_databases;do
tbl_file=`ls ./db_tables|grep $db`
for tbl in `cat ./db_tables/$tbl_file`
do
hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -overwrite hdfs://nn1:8020/user/hive/warehouse/$db.db/$tbl hdfs://nn2:8020/user/hive/warehouse/$db.db/$tbl
hive -e "use $db; msck repair table $tbl;"
echo "hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true hdfs://nn1:8020/user/hive/warehouse/$db.db/$tbl hdfs://nn2:8020/user/hive/warehouse/$db.db/$tbl" >> distcp_for_${db}.txt
done
done
示例把表stg.wd_windcustomcode由旧集群迁移到新集群
hive -e "use stg; show create table wd_windcustomcode;" >>stg_tablesDDL.sql
修改stg_tablesDDL.sql中LOCATION指向新集群节点,并在表名前加上库名前缀
hive> create database stg;
[root@cdh07 ~]# hive -f stg_tablesDDL.sql
[root@cdh07 ~]# hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -overwrite hdfs://cdh06.businessmatrix.com.cn:8020/user/hive/warehouse/stg.db/wd_windcustomcode \ hdfs://cdh601.businessmatrix.com.cn:8020/user/hive/warehouse/stg.db/wd_windcustomcode
hive> msck repair table stg.wd_windcustomcode
服务器/etc/hosts文件需添加对应主机名解析
[root@cdh07 ~]# hadoop distcp -update hdfs://cdh06.businessmatrix.com.cn:8020/user/hive/warehouse/stg.db/wd_windcustomcode hdfs://cdh601.businessmatrix.com.cn:8020/user/hive/warehouse/stg.db/wd_windcustomcode
注:在使用update选项的情况下,如果被拷贝文件在目标位置中已经存在,但文件内容不同,则目标位置的文件内容会被更新。
DistCp会尝试着均分需要拷贝的内容,这样每个map拷贝差不多相等大小的内容。 但因为文件是最小的拷贝粒度,所以配置增加同时拷贝(如map)的数目不一定会增加实际同时拷贝的数目以及总吞吐量。
如果没使用-m选项,DistCp会尝试在调度工作时指定map的数目 为 min (total_bytes / bytes.per.map, 20 * num_task_trackers), 其中bytes.per.map默认是256MB。
建议对于长时间运行或定期运行的作业,根据源和目标集群大小、拷贝数量大小以及带宽调整map的数目。
对于不同Hadoop版本间的拷贝,用户应该使用HftpFileSystem。 这是一个只读文件系统,所以DistCp必须运行在目标端集群上(更确切的说是在能够写入目标集群的TaskTracker上)。 源的格式是 hftp://。
像前面提到的,map拷贝输入文件失败时,会带来一些副效应。
-i,任务产生的日志会被新的尝试替换掉。-overwrite,文件被之前的map成功拷贝后当又一次执行拷贝时会被标记为 “被忽略”。map失败了mapred.map.max.attempts次,剩下的map任务会被终止(除非使用了-i)。mapred.speculative.execution被设置为 final和true,则拷贝的结果是未定义的。