
# 使用distcp迁移Hive数据至MRS集群
#### 应用场景
distcp（Distributed Copy）是Hadoop提供的一个分布式复制工具，用于在HDFS集群之间、HDFS与本地文件系统之间或同一集群内高效复制大量数据。它充分利用Hadoop的分布式计算能力，通过MapReduce框架并行处理复制任务，大幅提升大数据量的复制效率。
通过distcp命令，可以将自建Hive集群中存储在HDFS的数据，直接迁移至MRS集群。
本章节介绍了在完成Hive元数据迁移后，通过distcp工具迁移全量Hive业务数据或增量Hive业务数据至MRS集群。
更多关于distcp的详细命令参数说明，请参考[distcp常见用法](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_0794.html#section3)。
#### 方案架构
Hive数据迁移至MRS集群，通常迁移流程如[图1]所示。
图1Hive数据迁移方案   
![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002429543065.png "点击放大")
- 历史数据迁移。 在源Hadoop集群为需要迁移的目录上创建快照，然后在MRS集群客户端上提交distcp全量迁移命令，选择目标端路径为OBS或HDFS。
  
- 分区修复。 使用**msck repair table** *db_name.table_name*命令对分区表进行修复分区操作。
  
- 增量业务数据迁移 在源Hadoop集群为需要增量迁移的目录上创建快照，然后在MRS集群客户端上添加"-update -delete"参数进行增量迁移，选择目标端路径为OBS或HDFS。
  
数据迁移方案支持各种网络选型，如公网、VPN、云专线等，根据实际情况选择网络方案，确保两端网络互通即可。
表1数据迁移网络方案说明 
| 迁移网络类型 | 优点                                                                                                                                                                                                                                                                              | 缺点                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|
| 专线     | - 性能稳定，时延低至毫秒级。  - 带宽选择范围可达几十Gbit/s。  - 数据传输安全性高。   | - 成本高，一般需包年包月。  - 源端和目的端私网IP地址不能重叠。  - 开通时间长，一般需提前1个月申请。   |
| VPN    | - 组网灵活，随时搭建。  - 稳定性较好，安全性较好。  - 成本适中。            | - 时延较高。  - 源端和目的端私网IP地址不能重叠。                                                                                          |
| 公网 IP  | - 支持源端和目的端私网IP一致的情况下实施迁移。  - 带宽任意选择。  - 即买即用，快速绑定成本低。     | - 带宽可能无法全部利用，迁移速率相对较慢。  - 公网传输数据有泄漏风险。                                                                                |
   
#### 约束与限制
- 迁移目标端为OBS桶时，distcp不支持增量迁移方式（因为OBS不支持快照）。
- 数据迁移前需提前了解用户业务并确定迁移时间窗，建议在业务低谷期进行迁移。
 
#### 前提条件
- 已创建好包含有Hive组件的MRS集群。
- 已准备一台ECS执行节点，并安装MRS集群客户端。
- 源集群、目标集群与MRS集群客户端所在节点的网络已打通。
- 已完成Hive元数据的迁移。
 
#### 使用distcp全量迁移Hive数据
1. 获取源集群中HDFS NameNode主节点的IP地址和端口。 
   不同自建集群的查询方式不同，可联系集群管理员确认或登录对应集群管理界面中查询。
   图2查看HDFS NameNode端口   
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002370556028.png "点击放大")
   
   
2. 登录目标MRS集群的Manager管理界面，查看HDFS NameNode主节点的IP地址和端口。 
   1. 单击"集群 \> 服务 \> HDFS \> 实例"，查看实例列表中"NameNode (hacluster,主)"实例对应的IP地址。
   
   2. 单击"配置"，搜索并查询NameNode端口配置参数"dfs.namenode.rpc.port"。
   
   
   
   

3. 调研获取源集群中需要迁移的Hive数据对应的HDFS文件目录地址。 
   例如迁移如下数据：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002400653845.png "点击放大")
   
   

4. 在ECS执行节点设置用户访问源端HDFS集群。 
   ```
   vim /etc/profile
   ```
   设置环境变量：
   ```
   export HADOOP_USER_NAME=hdfs
   ```
   加载环境变量：
   ```
   source /etc/profile
   ```
   
   

5. 为源集群中的指定HDFS目录创建快照，创建完成后保存路径为"/快照目录/.snapshot"。
   
   1. 开启源集群中指定目录的快照功能。
      ```
      hdfs dfsadmin -allowSnapshot 快照目录
      ```
      源集群目录格式：hdfs://NameNode主节点IP地址:端口/目录
      例如执行命令如下：
      ```
      hdfs dfsadmin -allowSnapshot hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db/
      ```
      
   
   2. 创建快照。
      ```
      hdfs dfs -createSnapshot 快照目录 快照文件名
      ```
      例如执行命令如下：
      ```
      hdfs dfs -createSnapshot hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db snapshot01
      ```
      
   
   
   
   

6. 进入MRS集群客户端目录。 
   ```
   cd /opt/client
   ```
   ```
   source bigdata_env
   ```
   开启了Kerberos认证的MRS集群需进行用户认证。
   ```
   kinit HDFS业务用户
   ```
   
   
7. 在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任务执行完成。
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002366934180.png "点击放大")
   
   

8. 继续参考[步骤 5]\~[步骤 7]完成其他数据目录的迁移。
9. 全量迁移完成后，在目标端集群通过客户端或者HDFS WebUI查看文件是否迁移成功。 
   例如源端文件：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002400653853.png "点击放大")
   目标端文件：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002367094080.png "点击放大")
   
   

10. 数据迁移完成后，在目标端通过Hive客户端对分区表进行分区修复，并查看数据是否存在。 
    执行命令进入Hive客户端。
    ```
    beeline
    ```
    - 分区表：
      ```
      msck repair table 表名;
      ```
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002400733981.png "点击放大")
      ```
      select * from 表名;
      ```
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002366934184.png "点击放大")
      
    
    - 非分区表：
      ```
      select * from 表名;
      ```
      ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002400653857.png "点击放大")
      
    
    
    
    
 
#### 使用distcp迁移增量Hive数据
1. 为源集群中需要增量迁移的目录创建快照。 
   ```
   hdfs dfs -createSnapshot 快照目录 快照文件名
   ```
   例如执行命令如下：
   ```
   hdfs dfs -createSnapshot hdfs://192.168.1.100:8020/warehouse/tablespace/external/hive/bigdata_test.db snapshot02
   ```
   
   
2. 在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任务执行完成。
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002404142205.png "点击放大")
   
   
3. 迁移完成后，在目标端集群通过客户端或者HDFS WebUI查看文件是否迁移成功，查看同步后的文件数量和大小，对比一致性。 
   例如源端文件：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002404062365.png "点击放大")
   目标端文件：
   ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002370582542.png "点击放大")
   
   
4. 数据迁移完成后，在目标端通过Hive客户端对分区表进行分区修复，并查看数据是否存在。 
   - 分区表：
     ```
     msck repair table 表名;
     ```
     ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002370422662.png "点击放大")
     ```
     select * from 表名;
     ```
     ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002404142209.png "点击放大")
     
   
   - 非分区表：
     ```
     select * from 表名;
     ```
     ![](https://support.huaweicloud.com/bestpractice-mrs/zh-cn_image_0000002404062369.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
  ```
  
 
