一、背景
- 由于公司现有
CDH
集群架设在虚拟机之上,节点数较少、节点硬件及网络资源受限,同时考虑到后续业务不断壮大的情况,旧集群性能已无法满足需求,迫切需要切换至配置更高的新集群。 - 在不影响现有业务的情况下迁移数据,确保新旧集群的顺利衔接和平稳过渡,同时确保新集群中的业务数据准确无误。
- 为减小对目前环境的影响,采用先搭建新集群然后同步业务数据的方案。
- 项目中涉及的业务数据均存储在
HDFS
上,迁移推荐使用DistCp
(分布式拷贝)工具。
二、数据迁移
2.1、DistCp简介(来自于官网)
2.1.1 基本概述
- 该工具用于大规模集群内部和集群之间数据拷贝,它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。
2.1.2 使用方法
hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo
- 这条命令会把nn1集群的
/foo/bar
目录下的所有文件或目录名展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务, 然后每个TaskTracker分别执行从nn1
到nn2
的拷贝操作。注意DistCp
使用绝对路径进行操作。
三、全量初始化迁移
3.1 元数据迁移
1) 获取旧集群所有数据库下的表
#!/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
2) 调整脚本
在生成的SQL
文件中批量修改path
及location
指向新集群的namenode
3) 在新集群上创建相关数据库及表
hive> create database stg;
hive> create database ods;
hive> create database dm;
3.2 业务数据迁移
配置好/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
3.3 数据迁移示例
示例把表stg.wd_windcustomcode
由旧集群迁移到新集群
1) 获取旧集群的建表语句
hive -e "use stg; show create table wd_windcustomcode;" >>stg_tablesDDL.sql
修改stg_tablesDDL.sql中LOCATION
指向新集群节点,并在表名前加上库名前缀
2) 在新集群上创建相关数据库及表
hive> create database stg;
[root@cdh07 ~]# hive -f stg_tablesDDL.sql
3) 执行迁移命令
[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
4) 修复新集群元数据
hive> msck repair table stg.wd_windcustomcode
5) 注意事项
服务器/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
选项的情况下,如果被拷贝文件在目标位置中已经存在,但文件内容不同,则目标位置的文件内容会被更新
。
五、注意事项
5.1 Map数目
DistCp
会尝试着均分需要拷贝的内容,这样每个map
拷贝差不多相等大小的内容。 但因为文件是最小的拷贝粒度,所以配置增加同时拷贝(如map
)的数目不一定会增加实际同时拷贝的数目以及总吞吐量。
如果没使用-m
选项,DistCp
会尝试在调度工作时指定map
的数目 为 min (total_bytes / bytes.per.map, 20 * num_task_trackers)
, 其中bytes.per.map
默认是256MB
。
建议对于长时间运行或定期运行的作业,根据源和目标集群大小、拷贝数量大小以及带宽调整map
的数目。
5.2 不同HDFS版本间的拷贝
对于不同Hadoop
版本间的拷贝,用户应该使用HftpFileSystem
。 这是一个只读文件系统,所以DistCp
必须运行在目标端集群上(更确切的说是在能够写入目标集群的TaskTracker
上)。 源的格式是 hftp://<dfs.http.address>/<path> (默认情况dfs.http.address是 <namenode>:50070)
。
5.3 Map/Reduce和副效应
像前面提到的,map
拷贝输入文件失败时,会带来一些副效应。
- 除非使用了
-i
,任务产生的日志会被新的尝试替换掉。 - 除非使用了
-overwrite
,文件被之前的map
成功拷贝后当又一次执行拷贝时会被标记为 “被忽略”。 - 如果
map
失败了mapred.map.max.attempts
次,剩下的map任务会被终止(除非使用了-i
)。 - 如果
mapred.speculative.execution
被设置为final
和true
,则拷贝的结果是未定义的。