
# 通过distcp迁移自建集群HDFS数据至MRS集群
#### 应用场景
distcp（Distributed Copy）是Hadoop提供的一个分布式复制工具，用于在HDFS集群之间、HDFS与本地文件系统之间或同一集群内高效复制大量数据。它充分利用Hadoop的分布式计算能力，通过MapReduce框架并行处理复制任务，大幅提升大数据量的复制效率。
通过distcp命令，可以将自建Hadoop集群中存储在HDFS的数据，直接迁移至MRS集群。
更多关于distcp的详细命令参数说明，请参考[distcp常见用法](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_0794.html#section3)。
#### 方案架构
Hadoop集群数据迁移至MRS集群，通常迁移流程如[图1]所示。
图1distcp迁移方案   
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002406122609.png "点击放大")
- 全量数据迁移
  1. 在源Hadoop集群上为需要迁移的目录创建快照。
  
  2. 通过MRS集群客户端提交distcp全量迁移命令，选择目标端路径为OBS或HDFS。
   
- 增量数据迁移
  1. 在源Hadoop集群上为需要增量迁移的目录创建快照。
  
  2. 通过MRS集群客户端提交添加了"-update -delete"参数的DistCp命令进行增量迁移，选择目标端路径为HDFS。
   
数据迁移方案支持各种网络选型，如公网、VPN、云专线等，根据实际情况选择网络方案，确保两端网络互通即可。
表1数据迁移网络方案说明 
| 迁移网络类型 | 优点                                                                                                                                                                                                                                                                                                                                                                  | 缺点                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|
| 专线     | - 性能稳定，时延低至毫秒级。  - 带宽选择范围可达几十Gbit/s。  - 数据传输安全性高。   | - 成本高，一般需包年包月。  - 源端和目的端私网IP地址不能重叠。  - 开通时间长，一般需提前1个月申请。   |
| VPN    | - 组网灵活，随时搭建。  - 稳定性较好，安全性较好。  - 成本适中。            | - 时延较高。  - 源端和目的端私网IP地址不能重叠。                                                                                                                  |
| 公网 IP  | - 支持源端和目的端私网IP一致的情况下实施迁移。  - 带宽任意选择。  - 即买即用，快速绑定成本低。     | - 带宽可能无法全部利用，迁移速率相对较慢。  - 公网传输数据有泄漏风险。                                                                                                        |
   
#### 约束与限制
- 迁移目标端为OBS桶时，distcp不支持增量迁移方式（因为OBS不支持快照）。
- 数据迁移前需提前了解用户业务并确定迁移时间窗，建议在业务低谷期进行迁移。
 
#### 前提条件
- 已创建好包含有Hadoop组件的MRS集群。
- 已准备一台ECS执行节点，并安装MRS集群客户端，节点与MRS集群处于同一个VPC及安全组内。
- 源集群、目标集群与MRS集群客户端所在节点的网络已打通（推荐使用云专线服务）。
 
#### 使用distcp迁移全量数据
1. 在准备好的ECS节点上安装MRS集群客户端。 
   客户端安装操作请参考[安装MRS集群客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html#section4)，例如客户端安装目录为"/opt/client"。
   
   
2. 获取源集群中HDFS NameNode主节点的IP地址和端口。 
   不同自建集群的查询方式不同，可联系集群管理员确认或登录对应集群管理界面中查询。
   图2查看HDFS NameNode端口   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002372144464.png "点击放大")
   
   
3. 登录目标MRS集群的Manager管理界面，查看HDFS NameNode主节点的IP地址和端口。 
   1. 单击"集群 \> 服务 \> HDFS \> 实例"，查看实例列表中"NameNode (hacluster,主)"实例对应的IP地址。
   
   2. 单击"配置"，搜索并查询NameNode端口配置参数"dfs.namenode.rpc.port"。
   
   
   
   
4. 调研获取源集群中需要迁移数据对应的HDFS文件目录地址。 
   例如，在本示例场景中，待迁移目录为"/benchmarks/TestDFSIO/io_data"。
   
   
5. 在ECS执行节点设置用户访问源端HDFS。 
   ```
   vim /etc/profile
   ```
   设置环境变量：
   ```
   export HADOOP_USER_NAME=hdfs
   ```
   加载环境变量：
   ```
   source /etc/profile
   ```
   
   
6. 为源集群中的指定HDFS目录创建快照，创建完成后保存路径为"/快照目录/.snapshot"。 
   1. 开启源集群中指定目录的快照功能。
      ```
      hdfs dfsadmin -allowSnapshot 快照目录
      ```
      源集群目录格式：hdfs://NameNode主节点IP地址:端口/目录
      例如执行命令如下：
      ```
      hdfs dfsadmin -allowSnapshot hdfs://192.168.1.100:8020/benchmarks/TestDFSIO/io_data
      ```
      
   
   2. 创建快照。
      ```
      hdfs dfs -createSnapshot 快照目录 快照文件名
      ```
      例如执行命令如下：
      ```
      hdfs dfs -createSnapshot hdfs://192.168.1.100:8020/benchmarks/TestDFSIO/io_data snapshot01
      ```
      
   
   
   
   
7. 进入MRS集群客户端目录。 
   ```
   cd /opt/client
   ```
   ```
   source bigdata_env
   ```
   开启了Kerberos认证的MRS集群需进行用户认证。
   ```
   kinit HDFS业务用户
   ```
   
   
8. 在MRS集群客户端节点中执行distcp命令进行数据迁移。 
   ```
   hadoop distcp -prbugpcxt 源端快照保存路径 目的端数据保存路径
   ```
   例如执行命令如下：
   ```
   hadoop distcp -prbugpcxt hdfs://192.168.1.100:8020/benchmarks/TestDFSIO/io_data/.snapshot/snapshot01/* hdfs://192.168.1.200:8020/hdfs/
   ```
   任务提交后，等待Mapreduce任务执行完成。
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002371984580.png "点击放大")
   
   
9. 全量迁移完成后，在目标端集群查看文件是否迁移成功。 
   ```
   hdfs dfs -ls HDFS文件目录
   ```
   例如查看源端全量文件如下：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002400649205.png "点击放大")
   查看目标端全量文件如下：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002367089458.png "点击放大")
   
   
 
#### 使用distcp迁移增量数据
1. 为源集群中需要增量迁移的目录创建快照。 
   ```
   hdfs dfs -createSnapshot 快照目录 快照文件名
   ```
   例如执行命令如下：
   ```
   hdfs dfs -createSnapshot hdfs://192.168.1.100:8020/benchmarks/TestDFSIO/io_data snapshot02
   ```
   
   
2. 在MRS集群客户端节点中执行distcp命令进行增量数据迁移。 
   ```
   hadoop distcp -prbugpcxt 源端快照保存路径 目的端数据保存路径
   ```
   例如执行命令如下：
   ```
   hadoop distcp -prbugpcxt -update -delete hdfs://192.168.1.100:8020/benchmarks/TestDFSIO/io_data/.snapshot/snapshot02/* hdfs://192.168.1.200:8020/hdfs
   ```
   任务提交后，等待Mapreduce任务执行完成。
   
   
3. 迁移完成后查看同步后的文件数量和大小，对比一致性。 
   ```
   hdfs dfs -ls HDFS文件目录
   ```
   例如查看源端增量文件如下：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002400649209.png "点击放大")
   查看目标端增量文件如下：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002367089462.png "点击放大")
   
   
 
#### 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常见用法](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_0794.html#section3)。
  
  - 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
  ```
  
 
