使用distcp迁移Hive数据至MRS集群
应用场景
distcp(Distributed Copy)是Hadoop提供的一个分布式复制工具,用于在HDFS集群之间、HDFS与本地文件系统之间或同一集群内高效复制大量数据。它充分利用Hadoop的分布式计算能力,通过MapReduce框架并行处理复制任务,大幅提升大数据量的复制效率。
通过distcp命令,可以将自建Hive集群中存储在HDFS的数据,直接迁移至MRS集群。
本章节介绍了在完成Hive元数据迁移后,通过distcp工具迁移全量Hive业务数据或增量Hive业务数据至MRS集群。
更多关于distcp的详细命令参数说明,请参考distcp常见用法。
方案架构
Hive数据迁移至MRS集群,通常迁移流程如图1所示。
- 历史数据迁移。
在源Hadoop集群为需要迁移的目录上创建快照,然后在MRS集群客户端上提交distcp全量迁移命令,选择目标端路径为OBS或HDFS。
- 分区修复。
- 增量业务数据迁移
在源Hadoop集群为需要增量迁移的目录上创建快照,然后在MRS集群客户端上添加“-update -delete”参数进行增量迁移,选择目标端路径为OBS或HDFS。
数据迁移方案支持各种网络选型,如公网、VPN、云专线等,根据实际情况选择网络方案,确保两端网络互通即可。
迁移网络类型 |
优点 |
缺点 |
---|---|---|
专线 |
|
|
VPN |
|
|
公网 IP |
|
|
约束与限制
- 迁移目标端为OBS桶时,distcp不支持增量迁移方式(因为OBS不支持快照)。
- 数据迁移前需提前了解用户业务并确定迁移时间窗,建议在业务低谷期进行迁移。
前提条件
- 已创建好包含有Hive组件的MRS集群。
- 已准备一台ECS执行节点,并安装MRS集群客户端。
- 源集群、目标集群与MRS集群客户端所在节点的网络已打通。
- 已完成Hive元数据的迁移。
使用distcp全量迁移Hive数据
- 获取源集群中HDFS NameNode主节点的IP地址和端口。
不同自建集群的查询方式不同,可联系集群管理员确认或登录对应集群管理界面中查询。
图2 查看HDFS NameNode端口 - 登录目标MRS集群的Manager管理界面,查看HDFS NameNode主节点的IP地址和端口。
- 单击“集群 > 服务 > HDFS > 实例”,查看实例列表中“NameNode (hacluster,主)”实例对应的IP地址。
- 单击“配置”,搜索并查询NameNode端口配置参数“dfs.namenode.rpc.port”。
- 调研获取源集群中需要迁移的Hive数据对应的HDFS文件目录地址。
例如迁移如下数据:
- 在ECS执行节点设置用户访问源端HDFS集群。
vim /etc/profile
设置环境变量:
export HADOOP_USER_NAME=hdfs
加载环境变量:
source /etc/profile
- 为源集群中的指定HDFS目录创建快照,创建完成后保存路径为“/快照目录/.snapshot”。
- 开启源集群中指定目录的快照功能。
hdfs dfsadmin -allowSnapshot 快照目录
源集群目录格式:hdfs://NameNode主节点IP地址:端口/目录
例如执行命令如下:
hdfs dfsadmin -allowSnapshot hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db/
- 创建快照。
hdfs dfs -createSnapshot 快照目录 快照文件名
例如执行命令如下:
hdfs dfs -createSnapshot hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db snapshot01
- 开启源集群中指定目录的快照功能。
- 进入MRS集群客户端目录。
cd /opt/client
source bigdata_env
开启了Kerberos认证的MRS集群需进行用户认证。
kinit HDFS业务用户
- 在MRS集群客户端节点中执行distcp命令进行数据迁移。
hadoop distcp -prbugpcxt 源端快照保存路径 目的端数据保存路径
例如执行命令如下:
hadoop distcp -prbugpcxt hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db/.snapshot/snapshot01/* hdfs://192.168.1.200:8020/user/hive/warehouse/bigdata_test.db
任务提交后,等待Mapreduce任务执行完成。
- 数据迁移完成后,在目标端通过Hive客户端对分区表进行分区修复,并查看数据是否存在。
执行命令进入Hive客户端。
beeline
- 分区表:
msck repair table 表名;
select * from 表名;
- 非分区表:
select * from 表名;
- 分区表:
使用distcp迁移增量Hive数据
- 为源集群中需要增量迁移的目录创建快照。
hdfs dfs -createSnapshot 快照目录 快照文件名
例如执行命令如下:
hdfs dfs -createSnapshot hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db snapshot02
- 在MRS集群客户端节点中执行distcp命令进行增量数据迁移。
hadoop distcp -prbugpcxt 源端快照保存路径 目的端数据保存路径
例如执行命令如下:
hadoop distcp -prbugpcxt -update -delete hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db/.snapshot/snapshot02/ hdfs://192.168.1.200:8020/user/hive/warehouse/bigdata_test.db
任务提交后,等待Mapreduce任务执行完成。
- 迁移完成后,在目标端集群通过客户端或者HDFS WebUI查看文件是否迁移成功,查看同步后的文件数量和大小,对比一致性。
例如源端文件:
目标端文件:
- 数据迁移完成后,在目标端通过Hive客户端对分区表进行分区修复,并查看数据是否存在。
- 分区表:
msck repair table 表名;
select * from 表名;
- 非分区表:
select * from 表名;
- 分区表:
distcp迁移数据常见问题
- 版本差异问题
当源端集群Hadoop版本与MRS版本相同(大版本相同,小版本可以存在差异),同步源端表业务数据至MRS集群命令如下:
hadoop distcp -prbugpcaxt hdfs://主NameNodeIP地址:端口/快照路径 保存路径
当源端集群Hadoop版本与MRS版本差异较大,可使用webhdfs或hftp代替HDFS执行以下命令。
hadoop distcp -prbugpcaxt webhdfs://主NameNodeIP地址:端口/快照路径 保存路径
或者:
hadoop distcp -prbugpcaxt hftp://主NameNodeIP地址:端口/快照路径 保存路径
- 使用distcp命令参数问题
- -p[rbugpcaxt]:指定了保持的数据对应属性,各属性详情参考distcp常见用法。
- IP地址:源端NameNode提供服务的主节点。
- 端口:通常HDFS默认开源端口为8020,webhdfs和hftp端口为50070。
- 当源端集群提供了统一域名访问时,“主NameNodeIP地址:端口”可修改为对应的域名URL。
- distcp权限限制问题
使用distcp迁移时,distcp可能会由于权限限制而无法复制文件或目录。
请确保执行distcp的用户具有足够的权限来读取源文件和写入目标文件,可以使用-p参数保留权限信息。
- distcp命令修改超时时间
当使用distcp命令时,如果某些被复制的文件内容较大时,建议修改执行复制任务的Mapreduce的超时时间。
可以通过在distcp命令中指定“mapreduce.task.timeout”选项实现。
例如,修改超时时间为30分钟,则命令如下:
hadoop distcp -Dmapreduce.task.timeout=1800000 hdfs://cluster1/source hdfs://cluster2/target