本文档风哥主要介绍Hadoop集群数据迁移,包括迁移方法、工具使用、数据验证等内容,风哥教程参考Hadoop官方文档DistCp等内容,适合大数据运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 数据迁移概述
Hadoop集群数据迁移是大数据运维的重要工作,需要确保数据完整性和业务连续性。学习交流加群风哥微信: itpux-com
- 数据完整性:确保数据不丢失
- 业务连续性:最小化业务影响
- 迁移效率:提高迁移速度
- 数据验证:验证迁移结果
数据迁移是大数据运维的重要工作,
需要确保数据安全和业务连续。
主要目标:
1. 数据安全
– 数据不丢失
– 数据不损坏
– 数据一致性
2. 业务连续
– 最小化停机时间
– 平滑切换
– 可回滚
3. 高效迁移
– 充分利用带宽
– 并行迁移
– 断点续传
# 迁移场景
场景 描述 频率
集群升级 硬件或软件升级 低
机房迁移 数据中心迁移 低
数据整合 多集群数据整合 中
数据备份 灾备数据同步 高
数据分发 数据分发到下游 高
# 迁移类型
1. 集群内迁移
– 数据均衡
– 目录迁移
– 存储类型转换
2. 跨集群迁移
– 同版本迁移
– 跨版本迁移
– 跨平台迁移
3. 跨平台迁移
– HDFS到对象存储
– 对象存储到HDFS
– 其他文件系统
# 迁移流程
┌─────────────────────────────────────────┐
│ 迁移评估 │
│ 数据量评估、时间评估、风险评估 │
└───────────────────┬─────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 迁移准备 │
│ 环境准备、工具准备、方案制定 │
└───────────────────┬─────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 迁移实施 │
│ 数据迁移、进度监控、问题处理 │
└───────────────────┬─────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 数据验证 │
│ 完整性验证、一致性验证、功能验证 │
└───────────────────┬─────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 业务切换 │
│ 应用切换、监控观察、问题回滚 │
└─────────────────────────────────────────┘
# 迁移原则
1. 安全第一
确保数据安全,做好备份
2. 分批迁移
大数据量分批迁移
3. 充分测试
迁移前充分测试
4. 可回滚
保留回滚能力
5. 监控全程
全程监控迁移过程
1.2 迁移工具介绍
迁移工具介绍:
DistCp是Hadoop自带的分布式拷贝工具,
用于大规模数据迁移。
特点:
– 分布式并行拷贝
– 支持断点续传
– 支持增量同步
– 支持跨集群
基本用法:
$ hadoop distcp hdfs://source/path hdfs://target/path
常用参数:
参数 说明
-p 保留权限、时间戳等
-update 增量更新
-skipcrccheck 跳过CRC校验
-m Map任务数
-bandwidth 带宽限制(MB/s)
# DistCp2
DistCp的改进版本,性能更好。
特点:
– 更好的性能
– 更灵活的配置
– 支持更多选项
# HDFS同步工具
1. HDFS快照
功能: 创建目录快照
用途: 数据备份、恢复
命令:
$ hdfs dfsadmin -allowSnapshot /path
$ hdfs dfs -createSnapshot /path snapshot_name
2. HDFS归档
功能: 小文件归档
用途: 减少小文件数量
命令:
$ hadoop archive -archiveName archive.har /source /target
# 第三方工具
1. Apache Sqoop
用途: 关系数据库与Hadoop数据迁移
特点: 支持增量导入导出
2. Apache Flume
用途: 日志数据采集
特点: 实时数据流
3. 自定义工具
用途: 特殊场景迁移
特点: 灵活定制
# 工具对比
工具 场景 优点 缺点
DistCp HDFS数据迁移 并行高效 配置复杂
Sqoop RDBMS迁移 增量支持 性能有限
Flume 日志采集 实时性好 不适合批量
快照 数据备份 速度快 占用空间
# 迁移工具选择
场景 推荐工具
HDFS到HDFS DistCp
HDFS到对象存储 DistCp/S3DistCp
RDBMS到Hadoop Sqoop
实时数据同步 Flume/Kafka
小文件迁移 归档后DistCp
1.3 迁移策略介绍
迁移策略介绍:
1. 全量迁移
适用场景:
– 初始迁移
– 数据量较小
– 允许停机
优点:
– 简单直接
– 数据一致性好
缺点:
– 迁移时间长
– 需要停机
2. 增量迁移
适用场景:
– 数据持续更新
– 业务不能停
– 大数据量
优点:
– 迁移时间短
– 业务影响小
缺点:
– 需要多次同步
– 实现复杂
3. 双写迁移
适用场景:
– 零停机要求
– 数据实时性高
优点:
– 无停机时间
– 数据实时
缺点:
– 实现复杂
– 需要应用改造
# 迁移策略选择
因素 全量迁移 增量迁移 双写迁移
数据量 小 大 大
停机时间 长 短 无
实现复杂度 低 中 高
数据实时性 低 中 高
适用场景 初始迁移 持续同步 零停机
# 迁移时间评估
评估公式:
迁移时间 = 数据量 / (带宽 × 并行度 × 有效率)
示例:
数据量: 100TB
带宽: 1Gbps
并行度: 10
有效率: 70%
计算:
100TB × 1024 × 8 / (1000Mbps × 10 × 0.7) = 117小时
# 迁移风险评估
风险类型 影响 应对措施
网络故障 迁移中断 断点续传
磁盘故障 数据丢失 数据校验
数据不一致 业务异常 数据验证
性能下降 业务影响 带宽限制
权限丢失 访问失败 权限同步
Part02-生产环境规划与建议
2.1 环境规划建议
环境规划建议:
项目 要求
Hadoop版本 记录版本信息
数据量 统计总数据量
文件数量 统计文件数量
目录结构 记录目录结构
权限配置 记录权限信息
# 目标集群规划
项目 要求
Hadoop版本 兼容源版本
存储容量 大于源数据量
网络带宽 充足带宽
服务配置 完整配置
# 迁移环境规划
项目 配置
迁移服务器 4C/8G/100G
临时存储 500GB
网络带宽 10Gbps
监控告警 配置监控
# 时间窗口规划
阶段 时间
迁移准备 1-2天
数据迁移 根据数据量
数据验证 1天
业务切换 半天
观察期 1周
2.2 数据规划建议
数据规划建议:
优先级 数据类型 迁移顺序
P0 核心业务数据 第一批
P1 重要业务数据 第二批
P2 一般业务数据 第三批
P3 历史归档数据 最后
# 数据量统计
# 统计总数据量
$ hdfs dfs -du -h /
# 统计目录数据量
$ hdfs dfs -du -h /user/fgedu
# 统计文件数量
$ hdfs fsck / | grep “Total files”
# 权限备份
# 导出权限信息
$ hdfs dfs -ls -R / > /tmp/hdfs_permissions.txt
# 导出ACL
$ for dir in $(hdfs dfs -ls / | awk ‘{print $8}’); do
hdfs dfs -getfacl -R $dir >> /tmp/hdfs_acls.txt
done
2.3 网络规划建议
网络规划建议:
场景 带宽要求
集群内迁移 充分利用内网
跨集群迁移 专线或VPN
跨机房迁移 专线带宽
# 带宽限制
# DistCp带宽限制
$ hadoop distcp -bandwidth 100 hdfs://source hdfs://target
# 说明: 限制带宽为100MB/s
# 网络优化
1. 使用压缩
$ hadoop distcp -Dmapreduce.map.compress=true
2. 增加并行度
$ hadoop distcp -m 50 hdfs://source hdfs://target
3. 调整缓冲区
$ hadoop distcp -Dio.file.buffer.size=65536
Part03-生产环境项目实施方案
3.1 HDFS数据迁移实战
# 统计源数据
$ hdfs dfs -du -h /user/fgedu
1.5T /user/fgedu/data
500G /user/fgedu/logs
200G /user/fgedu/tmp
2.2T /user/fgedu
# 检查文件数量
$ hdfs fsck /user/fgedu | grep “Total files”
Total files: 1234567
# 备份权限
$ hdfs dfs -getfacl -R /user/fgedu > /tmp/fgedu_acls.txt
# 2. 创建目标目录
$ hdfs dfs -mkdir -p /user/fgedu
# 3. 执行DistCp迁移
# 基本迁移
$ hadoop distcp hdfs://source-cluster:8020/user/fgedu hdfs://target-cluster:8020/user/fgedu
# 带参数迁移
$ hadoop distcp \
-p \
-update \
-skipcrccheck \
-m 20 \
-bandwidth 100 \
hdfs://source-cluster:8020/user/fgedu \
hdfs://target-cluster:8020/user/fgedu
参数说明:
-p: 保留权限、时间戳、块大小
-update: 增量更新
-skipcrccheck: 跳过CRC校验
-m 20: 使用20个Map任务
-bandwidth 100: 限制带宽100MB/s
# 4. 查看迁移进度
$ yarn application -list -appStates RUNNING
# 5. 查看迁移日志
$ yarn logs -applicationId application_1234567890_0001
# 6. 验证数据
# 验证数据量
$ hdfs dfs -du -h /user/fgedu
# 验证文件数量
$ hdfs fsck /user/fgedu | grep “Total files”
Total files: 1234567
# 验证数据完整性
$ hadoop distcp -update -skipcrccheck \
hdfs://source-cluster:8020/user/fgedu \
hdfs://target-cluster:8020/user/fgedu
# 无输出表示数据一致
# 7. 恢复权限
$ hdfs dfs -setfacl -R –set-file=/tmp/fgedu_acls.txt /user/fgedu
3.2 Hive数据迁移实战
# 导出建表语句
$ hive -e “SHOW DATABASES” > /tmp/databases.txt
$ for db in $(cat /tmp/databases.txt); do
hive -e “USE $db; SHOW TABLES” | while read table; do
hive -e “SHOW CREATE TABLE $db.$table” >> /tmp/hive_ddl.sql
echo “;” >> /tmp/hive_ddl.sql
done
done
# 2. 迁移HDFS数据
# 迁移Hive数据目录
$ hadoop distcp \
-p -update -m 30 \
hdfs://source-cluster:8020/user/hive/warehouse \
hdfs://target-cluster:8020/user/hive/warehouse
# 3. 导入Hive元数据
# 在目标集群执行
$ hive -f /tmp/hive_ddl.sql
# 4. 验证数据
# 验证表数量
$ hive -e “SHOW TABLES” | wc -l
# 验证数据量
$ hive -e “SELECT COUNT(*) FROM fgedu.fgedu_table”
# 5. 使用Hive Export/Import
# 导出表
$ hive -e “EXPORT TABLE fgedu.fgedu_table TO ‘/tmp/export/fgedu_table'”
# 迁移导出数据
$ hadoop distcp /tmp/export/fgedu_table hdfs://target-cluster:8020/tmp/export/
# 导入表
$ hive -e “IMPORT TABLE FROM ‘/tmp/export/fgedu_table'”
3.3 跨集群迁移实战
# 源集群: Hadoop 2.7
# 目标集群: Hadoop 3.3
# 使用WebHDFS
$ hadoop distcp \
webhdfs://source-cluster:50070/user/fgedu \
hdfs://target-cluster:8020/user/fgedu
# 2. 跨平台迁移
# HDFS到S3
$ hadoop distcp \
-Dfs.s3a.access.key=xxx \
-Dfs.s3a.secret.key=xxx \
hdfs://cluster/user/fgedu \
s3a://bucket/user/fgedu
# S3到HDFS
$ hadoop distcp \
-Dfs.s3a.access.key=xxx \
-Dfs.s3a.secret.key=xxx \
s3a://bucket/user/fgedu \
hdfs://cluster/user/fgedu
# 3. 增量迁移脚本
$ cat > /bigdata/scripts/migration/incremental_migration.sh << 'EOF' #!/bin/bash # incremental_migration.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn SOURCE="hdfs://source-cluster:8020/user/fgedu" TARGET="hdfs://target-cluster:8020/user/fgedu" LOG_FILE="/bigdata/logs/automation/migration.log" log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1" >> $LOG_FILE; }
# 第一次全量迁移
log_info “开始全量迁移…”
hadoop distcp -p -update -m 20 $SOURCE $TARGET >> $LOG_FILE 2>&1
log_info “全量迁移完成”
# 增量同步(多次)
for i in {1..3}; do
log_info “开始第${i}次增量同步…”
hadoop distcp -p -update -skipcrccheck -m 20 $SOURCE $TARGET >> $LOG_FILE 2>&1
log_info “第${i}次增量同步完成”
sleep 3600
done
log_info “迁移完成”
EOF
$ chmod +x /bigdata/scripts/migration/incremental_migration.sh
Part04-生产案例与实战讲解
4.1 数据迁移案例
# 1. 迁移评估
数据量: 100TB
文件数: 5000万
带宽: 10Gbps
预计时间: 约30小时
# 2. 迁移方案
采用增量迁移策略:
– 第一阶段: 全量迁移(停机)
– 第二阶段: 增量同步(业务运行)
– 第三阶段: 最终同步(短暂停机)
# 3. 实施步骤
# 步骤1: 全量迁移
$ hadoop distcp \
-p -m 50 \
hdfs://source:8020/data \
hdfs://target:8020/data
# 迁移进度监控
$ yarn application -list -appStates RUNNING
# 步骤2: 增量同步(业务恢复运行)
$ hadoop distcp \
-p -update -skipcrccheck -m 30 \
hdfs://source:8020/data \
hdfs://target:8020/data
# 步骤3: 最终同步(停机)
# 停止业务写入
$ hadoop distcp \
-p -update -skipcrccheck -m 30 \
hdfs://source:8020/data \
hdfs://target:8020/data
# 步骤4: 数据验证
$ hdfs fsck /data | grep “Total files”
Total files: 50000000
$ hdfs dfs -du -h /data
100T /data
# 步骤5: 业务切换
# 更新DNS或配置
# 启动目标集群业务
4.2 数据验证案例
# 1. 数据量验证
$ cat > /tmp/verify_data_size.sh << 'EOF'
#!/bin/bash
# verify_data_size.sh
SOURCE_SIZE=$(hdfs dfs -du -s hdfs://source:8020/data | awk '{print $1}')
TARGET_SIZE=$(hdfs dfs -du -s hdfs://target:8020/data | awk '{print $1}')
echo "源数据大小: $SOURCE_SIZE bytes"
echo "目标数据大小: $TARGET_SIZE bytes"
if [ "$SOURCE_SIZE" -eq "$TARGET_SIZE" ]; then
echo "数据量验证: 通过"
else
echo "数据量验证: 失败"
fi
EOF
$ bash /tmp/verify_data_size.sh
源数据大小: 109951162777600 bytes
目标数据大小: 109951162777600 bytes
数据量验证: 通过
# 2. 文件数量验证
$ cat > /tmp/verify_file_count.sh << 'EOF'
#!/bin/bash
# verify_file_count.sh
SOURCE_COUNT=$(hdfs fsck hdfs://source:8020/data 2>&1 | grep “Total files” | awk ‘{print $3}’)
TARGET_COUNT=$(hdfs fsck hdfs://target:8020/data 2>&1 | grep “Total files” | awk ‘{print $3}’)
echo “源文件数量: $SOURCE_COUNT”
echo “目标文件数量: $TARGET_COUNT”
if [ “$SOURCE_COUNT” -eq “$TARGET_COUNT” ]; then
echo “文件数量验证: 通过”
else
echo “文件数量验证: 失败”
fi
EOF
$ bash /tmp/verify_file_count.sh
源文件数量: 50000000
目标文件数量: 50000000
文件数量验证: 通过
# 3. 数据内容验证
# 抽样验证
$ hdfs dfs -cat hdfs://source:8020/data/sample.txt | md5sum
d41d8cd98f00b204e9800998ecf8427e
$ hdfs dfs -cat hdfs://target:8020/data/sample.txt | md5sum
d41d8cd98f00b204e9800998ecf8427e
# 4. 业务验证
# 运行业务查询
$ hive -e “SELECT COUNT(*) FROM fgedu.fgedu_table”
1234567890
# 对比源集群结果
$ hive -e “SELECT COUNT(*) FROM fgedu.fgedu_table” –hiveconf hive.metastore.uris=thrift://source:9083
1234567890
4.3 常见问题处理
4.3.1 迁移中断
# 排查步骤
# 1. 查看应用状态
$ yarn application -list -appStates FAILED
# 2. 查看日志
$ yarn logs -applicationId application_xxx
# 3. 检查网络
$ telnet target-cluster 8020
# 解决方案
# 使用-update参数重新执行
$ hadoop distcp -update hdfs://source hdfs://target
4.3.2 数据不一致
# 排查步骤
# 1. 对比数据量
$ hdfs dfs -du -s /data
# 2. 对比文件数
$ hdfs fsck /data | grep “Total files”
# 3. 检查损坏文件
$ hdfs fsck /data -list-corruptfileblocks
# 解决方案
# 重新迁移不一致的数据
$ hadoop distcp -update -skipcrccheck hdfs://source/data hdfs://target/data
Part05-风哥经验总结与分享
5.1 数据迁移最佳实践
数据迁移最佳实践建议:
1. 充分评估和准备
2. 选择合适的迁移策略
3. 做好数据备份
4. 充分测试验证
5. 制定回滚方案
5.2 使用建议
使用建议:
- 迁移前做好评估
- 迁移中监控进度
- 迁移后验证数据
- 保留回滚能力
5.3 工具推荐
数据迁移工具推荐:
- DistCp:HDFS数据迁移
- Sqoop:RDBMS数据迁移
- Hive Export/Import:Hive表迁移
- 自定义脚本:特殊场景迁移
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
