1. 首页 > Hadoop教程 > 正文

大数据教程FG168-Hadoop数据迁移升级实战

本文详细介绍Hadoop数据迁移升级实战,包括HDFS、Hive、HBase等数据迁移方案,参考DistCp、Sqoop、DataX等工具文档,适合大数据运维工程师使用。学习交流加群风哥微信: itpux-com

Part01-基础概念与理论知识

1.1 数据迁移概述

数据迁移是指将数据从一个系统转移到另一个系统的过程,包括全量迁移、增量迁移、数据校验等步骤。更多视频教程www.fgedu.net.cn

数据迁移场景:

  • 集群升级:从旧版本升级到新版本
  • 机房迁移:从一个机房迁移到另一个机房
  • 云迁移:从本地迁移到云或云之间迁移
  • 数据整合:多个集群整合到一个集群
  • 硬件替换:替换旧硬件

1.2 迁移类型

迁移类型:

# 迁移类型
全量迁移:
– 一次性迁移所有数据
– 适用于数据量小、停机时间短
– 简单直接

增量迁移:
– 先全量迁移
– 再定期增量同步
– 适用于数据量大、停机时间短

双写验证:
– 新旧集群同时写
– 验证数据一致性
– 逐步切流

# 迁移策略
停机迁移:
– 停止业务
– 迁移数据
– 验证数据
– 切换业务
– 优点:简单
– 缺点:停机时间长

在线迁移:
– 业务不停止
– 先全量后增量
– 数据校验
– 平滑切换
– 优点:停机时间短
– 缺点:复杂

1.3 迁移架构

迁移架构:

风哥提示:选择迁移方案时要考虑数据量、停机时间要求、复杂度等因素。在线迁移虽然复杂,但可以最小化停机时间。学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 迁移方案规划

迁移方案规划要点:

# 迁移步骤
1. 调研评估
– 数据量统计
– 业务分析
– 依赖关系分析
– 时间窗口评估

2. 方案设计
– 选择迁移工具
– 选择迁移策略
– 设计回滚方案
– 设计验证方案

3. 测试验证
– 测试环境验证
– 小规模试点
– 性能测试
– 数据校验

4. 正式迁移
– 全量迁移
– 增量同步
– 数据校验
– 业务切换

5. 后续监控
– 持续监控
– 问题处理
– 性能优化
– 经验总结

# 迁移工具选择
HDFS迁移:
– DistCp:HDFS之间
– HDFS API:自定义
– rsync:小文件

Hive迁移:
– DistCp + 元数据导出
– Hive EXPORT/IMPORT
– DataX
– Sqoop

HBase迁移:
– Export/Import
– CopyTable
– DistCp + 迁移WAL
– Replication

Kafka迁移:
– MirrorMaker
– 自定义Consumer/Producer
– Flink CDC

2.2 风险评估

风险评估:

风险识别:

  • 数据丢失:迁移过程中数据丢失
  • 数据不一致:新旧数据不一致
  • 业务中断:迁移导致业务不可用
  • 性能问题:迁移影响性能
  • 回滚失败:回滚方案失败

from bigdata视频:www.itpux.com

2.3 迁移规范

迁移规范:

# 命名规范
迁移任务:
– 格式:migrate_源_目标_时间
– 示例:migrate_oldcluster_newcluster_20240408

备份目录:
– 格式:/bigdata/fgdata/backup/迁移日期
– 示例:/bigdata/fgdata/backup/20240408

# 操作规范
操作前:
– 备份数据
– 备份元数据
– 检查环境
– 通知相关人员

操作中:
– 记录操作日志
– 监控进度
– 及时处理异常

操作后:
– 数据校验
– 功能验证
– 性能验证
– 文档更新

Part03-生产环境项目实施方案

3.1 HDFS数据迁移实战

3.1.1 DistCp迁移

# 1. 基础DistCp命令
hadoop distcp hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/

# 2. 带宽限制
hadoop distcp -bandwidth 100 hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/

# 3. 并发数调整
hadoop distcp -m 100 hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/

# 4. 增量迁移
hadoop distcp -update hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/

# 5. 覆盖已存在
hadoop distcp -overwrite hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/

# 6. 跳过检查
hadoop distcp -skipcrccheck hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/

# 7. 指定文件列表
hadoop distcp -f filelist.txt hdfs://new-cluster:8020/bigdata/

# 8. 完整迁移脚本
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OLD_CLUSTER=”hdfs://old-cluster:8020″
NEW_CLUSTER=”hdfs://new-cluster:8020″
SRC_PATH=”/bigdata/fgdata”
DST_PATH=”/bigdata/fgdata”
LOG_FILE=”/bigdata/fgdata/logs/distcp_$(date +%Y%m%d_%H%M%S).log”

echo “开始迁移…” | tee -a $LOG_FILE
echo “源路径: $OLD_CLUSTER$SRC_PATH” | tee -a $LOG_FILE
echo “目标路径: $NEW_CLUSTER$DST_PATH” | tee -a $LOG_FILE

hadoop distcp \
-bandwidth 100 \
-m 200 \
-update \
-skipcrccheck \
$OLD_CLUSTER$SRC_PATH \
$NEW_CLUSTER$DST_PATH \
2>&1 | tee -a $LOG_FILE

if [ $? -eq 0 ]; then
echo “迁移成功!” | tee -a $LOG_FILE
else
echo “迁移失败!” | tee -a $LOG_FILE
exit 1
fi

# 9. 数据校验
hadoop distcp -diff hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/fgdata

# 10. 对比文件数和大小
hdfs dfs -count hdfs://old-cluster:8020/bigdata/fgdata
hdfs dfs -count hdfs://new-cluster:8020/bigdata/fgdata

hdfs dfs -du -s hdfs://old-cluster:8020/bigdata/fgdata
hdfs dfs -du -s hdfs://new-cluster:8020/bigdata/fgdata

3.2 Hive数据迁移实战

3.2.1 Hive迁移

— 1. Hive EXPORT/IMPORT
— 旧集群导出
EXPORT TABLE fgedu_db.fgedu_user TO ‘hdfs://old-cluster:8020/bigdata/fgdata/export/fgedu_user’;

— 新集群导入
IMPORT TABLE fgedu_db.fgedu_user FROM ‘hdfs://old-cluster:8020/bigdata/fgdata/export/fgedu_user’;

— 2. DistCp + 元数据迁移
— 旧集群:导出表数据
hadoop distcp hdfs://old-cluster:8020/bigdata/fgdata/hive/warehouse/fgedu_db.db/fgedu_user \
hdfs://new-cluster:8020/bigdata/fgdata/hive/warehouse/fgedu_db.db/

— 旧集群:导出建表语句
hive -e “SHOW CREATE TABLE fgedu_db.fgedu_user” > create_table.sql

— 新集群:创建数据库
hive -e “CREATE DATABASE IF NOT EXISTS fgedu_db”

— 新集群:创建表
hive -f create_table.sql

— 新集群:修复表
hive -e “MSCK REPAIR TABLE fgedu_db.fgedu_user”

— 3. 迁移整个数据库脚本
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OLD_CLUSTER=”hdfs://old-cluster:8020″
NEW_CLUSTER=”hdfs://new-cluster:8020″
DB_NAME=”fgedu_db”
EXPORT_PATH=”/bigdata/fgdata/export”

# 获取所有表
TABLES=$(hive -e “USE $DB_NAME; SHOW TABLES;”)

for TABLE in $TABLES; do
echo “正在迁移表: $TABLE”

# 导出表
hive -e “USE $DB_NAME; EXPORT TABLE $TABLE TO ‘$OLD_CLUSTER$EXPORT_PATH/$DB_NAME/$TABLE’;”

# 传输数据
hadoop distcp $OLD_CLUSTER$EXPORT_PATH/$DB_NAME/$TABLE $NEW_CLUSTER$EXPORT_PATH/$DB_NAME/

# 新集群导入
hive -e “USE $DB_NAME; IMPORT TABLE $TABLE FROM ‘$NEW_CLUSTER$EXPORT_PATH/$DB_NAME/$TABLE’;”

echo “表 $TABLE 迁移完成”
done

echo “数据库 $DB_NAME 迁移完成!”

— 4. 数据校验
— 对比行数
hive -e “SELECT COUNT(*) FROM fgedu_db.fgedu_user”
hive –database fgedu_db -e “SELECT COUNT(*) FROM fgedu_user”

— 对比数据量
hdfs dfs -du -s hdfs://old-cluster:8020/bigdata/fgdata/hive/warehouse/fgedu_db.db/fgedu_user
hdfs dfs -du -s hdfs://new-cluster:8020/bigdata/fgdata/hive/warehouse/fgedu_db.db/fgedu_user

— 5. 元数据迁移
— 导出旧集群元数据
mysqldump -h old-mysql -u hive -p hive > hive_metadata.sql

— 导入新集群元数据
mysql -h new-mysql -u hive -p hive < hive_metadata.sql

— 6. 更新HDFS路径
— 如果HDFS路径改变,需要更新元数据
UPDATE DBS SET DB_LOCATION_URI = REPLACE(DB_LOCATION_URI, ‘old-cluster:8020’, ‘new-cluster:8020’);
UPDATE SDS SET LOCATION = REPLACE(LOCATION, ‘old-cluster:8020’, ‘new-cluster:8020’);

3.3 HBase数据迁移实战

3.3.1 HBase迁移

# 1. Export/Import
# 旧集群导出
hbase org.apache.hadoop.hbase.mapreduce.Export \
fgedu_user \
hdfs://old-cluster:8020/bigdata/fgdata/export/hbase/fgedu_user

# 传输数据
hadoop distcp \
hdfs://old-cluster:8020/bigdata/fgdata/export/hbase/fgedu_user \
hdfs://new-cluster:8020/bigdata/fgdata/export/hbase/

# 新集群导入
hbase org.apache.hadoop.hbase.mapreduce.Import \
fgedu_user \
hdfs://new-cluster:8020/bigdata/fgdata/export/hbase/fgedu_user

# 2. CopyTable
# 直接从旧集群复制到新集群
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
–peer.adr=new-cluster:2181:/hbase \
fgedu_user

# 3. CopyTable指定时间范围
hbase org.apache.hadoop.hbase.mapreduce.CopyTable \
–peer.adr=new-cluster:2181:/hbase \
–starttime=1704067200000 \
–endtime=1712486400000 \
fgedu_user

# 4. Snapshot迁移
# 旧集群创建Snapshot
hbase shell
snapshot ‘fgedu_user’, ‘fgedu_user_snapshot_20240408’

# 导出Snapshot
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot fgedu_user_snapshot_20240408 \
-copy-to hdfs://new-cluster:8020/bigdata/fgdata/hbase/snapshots \
-mappers 20 \
-bandwidth 100

# 新集群恢复Snapshot
hbase shell
restore_snapshot ‘fgedu_user_snapshot_20240408’

# 5. 完整迁移脚本
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OLD_CLUSTER=”hdfs://old-cluster:8020″
NEW_CLUSTER=”hdfs://new-cluster:8020″
TABLES=(“fgedu_user” “fgedu_order” “fgedu_product”)

for TABLE in “${TABLES[@]}”; do
echo “正在迁移表: $TABLE”

# 创建Snapshot
echo “create_snapshot ‘$TABLE’, ‘${TABLE}_snapshot_$(date +%Y%m%d)'” | hbase shell

# 导出Snapshot
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot “${TABLE}_snapshot_$(date +%Y%m%d)” \
-copy-to $NEW_CLUSTER/bigdata/fgdata/hbase/snapshots \
-mappers 20 \
-bandwidth 100

echo “表 $TABLE 迁移完成”
done

echo “所有表迁移完成!”

# 6. 数据校验
# 对比行数
echo “count ‘fgedu_user'” | hbase shell
echo “count ‘fgedu_user'” | hbase shell –zkquorum new-cluster

# 对比Region数
echo “list_regions ‘fgedu_user'” | hbase shell
echo “list_regions ‘fgedu_user'” | hbase shell –zkquorum new-cluster

风哥提示:HBase迁移推荐使用Snapshot方式,效率高且一致性好。HDFS迁移使用DistCp,Hive迁移根据场景选择EXPORT/IMPORT或DistCp+元数据迁移。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 全量迁移实战

4.1.1 完整迁移流程

# 1. 迁移前准备
# 备份元数据
mysqldump -h old-mysql -u hive -p hive > hive_metadata_$(date +%Y%m%d).sql
mysqldump -h old-mysql -u ranger -p ranger > ranger_metadata_$(date +%Y%m%d).sql

# 备份HDFS重要数据
hdfs dfs -cp /bigdata/fgdata/important /bigdata/fgdata/backup/important_$(date +%Y%m%d)

# 检查新集群环境
hdfs dfsadmin -report
yarn node -list
hbase hbck

# 2. 停止业务
# 通知业务方
# 停止写入
# 停止ETL任务

# 3. 全量迁移
# HDFS迁移
hadoop distcp \
-bandwidth 100 \
-m 200 \
hdfs://old-cluster:8020/bigdata/fgdata \
hdfs://new-cluster:8020/bigdata/

# Hive元数据迁移
mysql -h new-mysql -u hive -p hive < hive_metadata.sql

# 更新HDFS路径
mysql -h new-mysql -u hive -p hive << EOF
USE hive;
UPDATE DBS SET DB_LOCATION_URI = REPLACE(DB_LOCATION_URI, ‘old-cluster:8020’, ‘new-cluster:8020’);
UPDATE SDS SET LOCATION = REPLACE(LOCATION, ‘old-cluster:8020’, ‘new-cluster:8020’);
EOF

# HBase Snapshot迁移
for TABLE in $(echo “list” | hbase shell | grep -v ‘TABLE’ | grep -v ‘list’ | grep -v ‘row(s)’); do
echo “迁移表: $TABLE”
echo “snapshot ‘$TABLE’, ‘${TABLE}_snapshot'” | hbase shell
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \
-snapshot “${TABLE}_snapshot” \
-copy-to hdfs://new-cluster:8020/bigdata/fgdata/hbase/snapshots
done

# 4. 数据校验
# HDFS校验
hdfs dfs -count hdfs://old-cluster:8020/bigdata/fgdata
hdfs dfs -count hdfs://new-cluster:8020/bigdata/fgdata

# Hive校验
hive -e “USE fgedu_db; SHOW TABLES;”
hive -e “SELECT COUNT(*) FROM fgedu_db.fgedu_user”

# HBase校验
echo “count ‘fgedu_user'” | hbase shell
echo “count ‘fgedu_user'” | hbase shell –zkquorum new-cluster

# 5. 业务切换
# 更新配置
# 切换DNS
# 重启业务
# 验证业务

# 6. 监控
# 持续监控
# 性能监控
# 日志监控

4.2 增量迁移实战

4.2.1 增量同步

# 1. 全量迁移(第一次)
hadoop distcp hdfs://old-cluster:8020/bigdata/fgdata hdfs://new-cluster:8020/bigdata/

# 2. 定期增量同步(每小时)
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

OLD_CLUSTER=”hdfs://old-cluster:8020″
NEW_CLUSTER=”hdfs://new-cluster:8020″
LOG_FILE=”/bigdata/fgdata/logs/incremental_$(date +%Y%m%d_%H%M%S).log”

echo “开始增量同步: $(date)” | tee -a $LOG_FILE

# DistCp增量同步
hadoop distcp \
-update \
-bandwidth 50 \
-m 100 \
$OLD_CLUSTER/bigdata/fgdata \
$NEW_CLUSTER/bigdata/ \
2>&1 | tee -a $LOG_FILE

echo “增量同步完成: $(date)” | tee -a $LOG_FILE

# 3. 定时任务(crontab)
crontab -e
# 每小时执行一次增量同步
0 * * * * /bigdata/app/scripts/incremental_sync.sh

# 4. HBase增量同步(Replication)
# 旧集群配置
hbase shell
add_peer ‘1’, CLUSTER_KEY => ‘new-cluster:2181:/hbase’
enable_table_replication ‘fgedu_user’

# 5. Kafka增量同步(MirrorMaker)
kafka-mirror-maker.sh \
–consumer.config old-consumer.properties \
–producer.config new-producer.properties \
–whitelist ‘fgedu_*’ \
–num.streams 4

# 6. 数据校验(定期)
#!/bin/bash
# 校验关键表数据量
OLD_CNT=$(hive -e “SELECT COUNT(*) FROM fgedu_db.fgedu_user”)
NEW_CNT=$(hive –database fgedu_db -e “SELECT COUNT(*) FROM fgedu_user” –hiveconf hive.metastore.uris=thrift://new-hms:9083)

if [ “$OLD_CNT” -eq “$NEW_CNT” ]; then
echo “数据一致: $OLD_CNT”
else
echo “数据不一致! 旧: $OLD_CNT, 新: $NEW_CNT”
# 发送告警
fi

4.3 数据校验与回滚实战

4.3.1 数据校验

— 1. HDFS数据校验
— 对比文件数量
hdfs dfs -count hdfs://old-cluster:8020/bigdata/fgdata
hdfs dfs -count hdfs://new-cluster:8020/bigdata/fgdata

— 对比存储大小
hdfs dfs -du -s hdfs://old-cluster:8020/bigdata/fgdata
hdfs dfs -du -s hdfs://new-cluster:8020/bigdata/fgdata

— 2. Hive数据校验
— 对比行数
hive -e “SELECT COUNT(*) FROM fgedu_db.fgedu_user”
hive –database fgedu_db -e “SELECT COUNT(*) FROM fgedu_user”

— 对比分区
hive -e “SHOW PARTITIONS fgedu_db.fgedu_user_log”
hive –database fgedu_db -e “SHOW PARTITIONS fgedu_user_log”

— 对比数据量
hdfs dfs -du -s hdfs://old-cluster:8020/bigdata/fgdata/hive/warehouse/fgedu_db.db/fgedu_user
hdfs dfs -du -s hdfs://new-cluster:8020/bigdata/fgdata/hive/warehouse/fgedu_db.db/fgedu_user

— 3. 抽样校验
— 旧集群抽样
SELECT * FROM fgedu_db.fgedu_user ORDER BY RAND() LIMIT 100;

— 新集群抽样
SELECT * FROM fgedu_db.fgedu_user ORDER BY RAND() LIMIT 100;

— 4. 聚合校验
SELECT
COUNT(*),
SUM(user_id),
MIN(user_id),
MAX(user_id)
FROM fgedu_db.fgedu_user;

— 5. 回滚方案
— 回滚步骤
— 1. 停止新集群业务
— 2. 数据回滚(如需要)
— 3. 切换DNS/配置到旧集群
— 4. 验证旧集群业务
— 5. 分析迁移失败原因

— 6. 回滚脚本
#!/bin/bash
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

echo “开始回滚…”

# 1. 停止新集群业务
echo “停止新集群业务…”
# 停止相关服务

# 2. 切换配置
echo “切换配置…”
# 更新配置文件
# 更新DNS

# 3. 验证旧集群
echo “验证旧集群…”
hdfs dfsadmin -report
hive -e “SELECT COUNT(*) FROM fgedu_db.fgedu_user”

echo “回滚完成!”

生产环境建议:迁移前一定要做好备份,制定详细的回滚方案。先在测试环境演练,再在生产环境执行。数据校验要全面,确保数据一致性。更多视频教程www.fgedu.net.cn

Part05-风哥经验总结与分享

5.1 迁移最佳实践

迁移最佳实践:

  • 充分调研:迁移前充分调研,了解数据量、业务、依赖关系
  • 制定方案:制定详细的迁移方案和回滚方案
  • 测试验证:先在测试环境验证,小规模试点
  • 备份数据:迁移前备份数据和元数据
  • 数据校验:全面的数据校验,确保一致性
  • 监控告警:迁移过程中持续监控,及时告警

5.2 常见问题处理

# 常见问题1:DistCp慢
– 增加mapper数
– 增加带宽
– 合并小文件
– 使用增量模式
– 检查网络

# 常见问题2:DistCp失败
– 检查网络连接
– 检查权限
– 检查磁盘空间
– 查看日志
– 重试

# 常见问题3:数据不一致
– 检查是否有新写入
– 重新迁移
– 检查时间范围
– 检查过滤条件
– 对比抽样数据

# 常见问题4:Hive表访问失败
– 检查元数据
– MSCK修复表
– 检查HDFS权限
– 检查HDFS路径
– 检查配置

# 常见问题5:HBase迁移失败
– 检查Snapshot
– 检查HDFS空间
– 检查网络
– 查看日志
– 使用其他方法

5.3 迁移检查清单

# 迁移检查清单
– [ ] 调研评估完成
– [ ] 迁移方案确定
– [ ] 回滚方案制定
– [ ] 测试环境验证
– [ ] 数据备份完成
– [ ] 元数据备份完成
– [ ] 新集群环境检查
– [ ] 业务停止通知
– [ ] 全量迁移完成
– [ ] 增量迁移完成
– [ ] 数据校验通过
– [ ] 业务验证通过
– [ ] 文档更新完成
– [ ] 回滚方案验证

# 迁移后检查清单
– [ ] 业务正常运行
– [ ] 数据一致性
– [ ] 性能达标
– [ ] 监控正常
– [ ] 告警正常
– [ ] 文档完善
– [ ] 经验总结

风哥提示:数据迁移是高风险操作,一定要慎之又慎。建议从简单场景开始,积累经验后再处理复杂场景。迁移过程中要做好记录,便于后续总结和复盘。学习交流加群风哥QQ113257174

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息