Hadoop集群迁移中DistCp全量与增量数据迁移方案详解

一、DistCp工具概述

DistCp(Distributed Copy)是Hadoop生态系统中的分布式数据拷贝工具,专门用于大规模集群内部和集群之间的数据迁移。该工具基于MapReduce框架实现,具有以下核心特性:

特性说明优势
分布式拷贝使用MapReduce任务并行处理充分利用集群计算资源,提高迁移效率
错误处理自动重试失败的任务保证数据迁移的可靠性
增量同步支持-update参数只同步发生变化的数据,节省时间和带宽
带宽控制支持-bandwidth参数避免对生产环境造成过大压力

二、迁移前准备工作

2.1 环境配置要求

在进行数据迁移前,必须确保新旧集群满足以下条件:

# 1. 网络连通性检查
ping cdh06.businessmatrix.com.cn
ping cdh601.businessmatrix.com.cn

# 2. 主机名解析配置
# 在/etc/hosts文件中添加对应解析
echo "192.168.1.10 cdh06.businessmatrix.com.cn" >> /etc/hosts
echo "192.168.1.20 cdh601.businessmatrix.com.cn" >> /etc/hosts

# 3. 认证配置(如需要)
# 对于不同安全配置的集群,可能需要fallback认证
-D ipc.client.fallback-to-simple-auth-allowed=true

2.2 元数据准备

元数据迁移是数据迁移的前提,需要先获取旧集群的表结构信息:

#!/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

三、全量数据迁移实施步骤

3.1 元数据迁移详细流程

-- 在新集群创建数据库
hive> create database stg;
hive> create database ods;
hive> create database dm;

-- 执行修改后的建表语句
-- 需要调整LOCATION指向新集群路径
[root@cdh07 ~]# hive -f stg_tablesDDL.sql

关键修改点:在生成的SQL文件中需要批量修改LOCATION路径,将旧集群的namenode地址替换为新集群地址。

3.2 业务数据全量迁移

全量迁移脚本实现自动化处理:

#!/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
        # 执行DistCp数据迁移
        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

# 2. 修改LOCATION指向新集群
# 原始:LOCATION 'hdfs://cdh06:8020/user/hive/warehouse/stg.db/wd_windcustomcode'
# 修改为:LOCATION 'hdfs://cdh601:8020/user/hive/warehouse/stg.db/wd_windcustomcode'

# 3. 在新集群创建表结构
[root@cdh07 ~]# hive -f stg_tablesDDL.sql

# 4. 执行数据迁移
[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

# 5. 修复元数据
hive> msck repair table stg.wd_windcustomcode;

四、增量数据迁移方案

4.1 增量迁移命令

增量迁移使用-update参数,只同步发生变化的数据:

# 增量同步示例
[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选项的情况下,DistCp会比较源和目标文件的checksum,如果文件内容不同,则目标位置的文件会被更新。

4.2 增量迁移脚本优化

为实现定期增量同步,可以创建自动化脚本:

#!/bin/bash
# 增量数据同步脚本
LOG_FILE="/var/log/distcp_incremental.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] Starting incremental data sync..." >> $LOG_FILE

# 读取全量迁移时记录的表列表
for db_file in distcp_for_*.txt
do
    while read distcp_cmd
    do
        # 将-overwrite替换为-update进行增量同步
        incremental_cmd=$(echo $distcp_cmd | sed 's/distcp /distcp -update /')
        
        echo "[$DATE] Executing: $incremental_cmd" >> $LOG_FILE
        eval $incremental_cmd
        
        if [ $? -eq 0 ]; then
            echo "[$DATE] Success: $incremental_cmd" >> $LOG_FILE
        else
            echo "[$DATE] Failed: $incremental_cmd" >> $LOG_FILE
        fi
    done < $db_file
done

echo "[$DATE] Incremental data sync completed." >> $LOG_FILE

五、性能优化与注意事项

5.1 Map任务数量调优

DistCp的Map数量直接影响迁移性能,需要合理配置:

# 手动设置Map数量
hadoop distcp -m 50 \
-update \
hdfs://nn1:8020/source/path \
hdfs://nn2:8020/target/path

# Map数量计算原则
# 默认公式:min(total_bytes / bytes.per.map, 20 * num_task_trackers)
# 其中bytes.per.map默认是256MB

调优建议:对于长时间运行或定期运行的作业,应根据源和目标集群大小、拷贝数据量大小以及带宽情况调整map数目。

5.2 带宽控制

为避免对生产环境造成影响,可以限制迁移带宽:

# 限制带宽为100MB/s
hadoop distcp -bandwidth 100 \
-update \
hdfs://nn1:8020/source/path \
hdfs://nn2:8020/target/path

5.3 不同Hadoop版本间的迁移

对于跨版本迁移,需要使用HftpFileSystem:

# 从低版本向高版本迁移
hadoop distcp hftp://old-nn:50070/source/path \
hdfs://new-nn:8020/target/path

注意事项:HftpFileSystem是只读文件系统,因此DistCp必须运行在目标端集群上。

六、迁移验证与监控

6.1 数据一致性验证

迁移完成后需要进行数据验证:

# 检查文件数量和大小
hadoop fs -count /user/hive/warehouse/stg.db/wd_windcustomcode
hadoop fs -du -h /user/hive/warehouse/stg.db/wd_windcustomcode

# 抽样验证数据内容
hive -e "SELECT COUNT(*) FROM stg.wd_windcustomcode;"

6.2 监控迁移进度

通过MapReduce作业界面监控迁移进度:

# 查看正在运行的DistCp作业
hadoop job -list

# 查看具体作业详情
hadoop job -status job_id

通过上述完整的全量与增量数据迁移方案,可以确保Hadoop集群从虚拟机到高配新环境的平滑过渡,既保证了数据的一致性,又最大限度地减少了业务中断时间。在实际操作中,建议先在小规模测试环境验证迁移流程,确认无误后再在生产环境执行。


参考来源

 

更多推荐