七夕来袭!还要做CDH数据迁移怎么办?来看看DistCp

一、背景

  • 由于公司现有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分别执行从nn1nn2的拷贝操作。注意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文件中批量修改pathlocation指向新集群的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被设置为 finaltrue,则拷贝的结果是未定义的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页
评论

打赏作者

小林家的史莱姆

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值