(课堂笔记)数据迁移(Sqoop迁移)Sqoop = 关系型数据库 ↔ Hadoop 的数据传输工具

发布时间:2026/5/28 17:51:31

(课堂笔记)数据迁移(Sqoop迁移)Sqoop = 关系型数据库 ↔ Hadoop 的数据传输工具 本文系统梳理了数据迁移的核心知识与实践方法。主要内容包括1数据迁移概念类比搬家过程及应用场景国产化替代、数仓建设等2标准化三步流程模型迁移注意数据类型/分区差异、数据迁移Shell/Sqoop两种方式、数据验证4维度校验3重点工具Sqoop的实战指南参数详解、并行原理、批量脚本4完整的数据验证方案行数比对、MD5校验等5面试高频问题解析。文章提供可操作的练习任务强调迁移过程中数据类型转换、并行优化和严格验证的重要性适合开发者快速掌握这一关键技术。这是非常实用的数据迁移笔记我帮你重新梳理优化让你理解为什么做、怎么做、注意事项。这个知识点在面试和实际项目中都非常重要。 数据迁移 笔记优化版一、什么是数据迁移一句话理解数据迁移 把老系统的数据脚本搬到新平台通俗类比你家搬新房旧家具→打包→运输→搬到新家→摆放整齐数据迁移旧库数据→抽取→转换→写入新库→验证正确二、为什么要做数据迁移背景2.1 国产化替代你笔记里提到的text美国限制高科技产品出口 ↓ 国内企业不能用Oracle/IBM等商业软件 ↓ 必须换成国产数据库华为GaussDB、阿里OceanBase、TiDB等 ↓ 需要把老系统数据迁移到新平台2.2 其他场景场景说明数仓建设业务库 → 数仓ODS层技术升级Hadoop 2.x → 3.x云迁移自建机房 → 阿里云/腾讯云合并拆分公司合并数据整合三、数据迁移三步走核心框架text第1步模型迁移建表 ↓ 第2步历史数据及脚本迁移导数据 ↓ 第3步数据验证对账3.1 模型迁移表迁移做什么在目标库创建同等结构的表注意点注意点说明例子数据类型差异不同数据库类型不同MySQL的INT→ Hive的INTOracle的NUMBER→ Hive的DECIMAL分区/分桶Hive特有的优化手段按日期分区PARTITIONED BY (dt STRING)存储格式不同格式性能不同文本格式 → Parquet/ORC列式存储字符集避免中文乱码统一用UTF-8示例MySQL → Hive 数据类型映射MySQL类型Hive类型注意INTINT直接对应BIGINTBIGINT直接对应VARCHAR(n)STRINGHive用STRINGDATETIMESTRING存成字符串或用TIMESTAMPDECIMAL(10,2)DECIMAL(10,2)保持一致3.2 历史数据及脚本迁移做什么把老数据导出来导进新库把ETL脚本重写适配新平台注意点注意点说明解决方案字符集编码避免乱码统一UTF-8导出时指定字符集迁移效率数据量大时很慢用Sqoop/DataX并行迁移分配资源脚本逻辑SQL方言不同Oracle PL/SQL → Hive SQL重写3.3 数据验证最重要做什么确保迁移后的数据准确无误验证维度text维度1行数验证 源表行数 目标表行数 维度2内容验证 抽样对比数据内容是否一致 维度3关键指标验证 SUM(金额)、COUNT(DISTINCT 用户) 等指标对比 维度4业务逻辑验证 跑几个业务SQL看结果是否一致四、数据迁移两种方式对比方式工具适用场景优点缺点Shell脚本MySQL Hive命令小数据量、简单迁移灵活、可控慢、不支持并行ETL工具Sqoop、DataX大数据量、生产环境快、支持并行、断点续传需要学习工具五、方式一Shell脚本迁移你笔记里的5.1 完整流程解析bash#!/bin/bash #### Step 1在目标库建表 hive -e use a2608; drop table if exists hive_chongzhi; create table hive_chongzhi( id int, ename string, amount int, dt string ) row format delimited fields terminated by \t # 字段分隔符 #### Step 2获取源端数据到中间文件 mkdir -p /home/hadoop/2608/test # 导出MySQL数据去掉表头 mysql -e select * from lee.t_chongzhi order by id /home/hadoop/2608/test/data sed -i 1d /home/hadoop/2608/test/data # 删除第一行列名 #### Step 3加载数据到Hive hive -e use a2608; load data local inpath /home/hadoop/2608/test/data into table hive_chongzhi #### Step 4数据校验 # 4.1 导出Hive数据 rm -rf /home/hadoop/2608/test/data_bak hadoop fs -get /user/hive/warehouse/a2608.db/hive_chongzhi/data /home/hadoop/2608/test/data_bak # 4.2 行数对比 lin_1$(cat /home/hadoop/2608/test/data | wc -l) lin_2$(cat /home/hadoop/2608/test/data_bak | wc -l) if [ $lin_1 -eq $lin_2 ]; then echo hive 表数据行数跟 mysql 表数据行数一致 fi # 4.3 随机抽样10条对比内容 flag0 for((i1;i10;i)); do x$[$RANDOM % $lin_1 1] # 随机行号 con_1$(cat /home/hadoop/2608/test/data | head -$x | tail -1) con_2$(cat /home/hadoop/2608/test/data_bak | head -$x | tail -1) if [ $con_1 ! $con_2 ]; then flag1 fi done if [ $flag -eq 0 ]; then echo 源库跟目标库抽样对比无差异 else echo 数据比对有问题请检查 fi5.2 这个脚本的问题面试可以说问题说明改进方案全量导出到本地数据量大时磁盘爆了用Sqoop直接导入HDFS单线程速度慢用Sqoop的-m参数并行随机抽样不严谨可能漏掉问题数据全量MD5比对或用工具六、方式二Sqoop迁移生产推荐6.1 Sqoop是什么Sqoop 关系型数据库 ↔ Hadoop 的数据传输工具textMySQL/Oracle/PostgreSQL ←→ Sqoop ←→ HDFS/Hive/HBase6.2 单表迁移示例bashsqoop import \ --connect jdbc:mysql://192.168.5.100:3306/lee \ --username root \ --password 123456 \ --table emp \ --fields-terminated-by \t \ --lines-terminated-by \n \ --hive-import \ --hive-overwrite \ --create-hive-table \ --delete-target-dir \ --hive-database a2608 \ --hive-table hive_emp \ -m 16.3 参数详解背下来参数作用例子--connect数据库连接URLjdbc:mysql://ip:3306/db--username用户名root--password密码123456--table要导入的表emp--fields-terminated-by列分隔符\t制表符--hive-import导入到Hive不加则导入HDFS--hive-overwrite覆盖已有数据慎用--create-hive-table自动创建Hive表会自动映射类型--hive-databaseHive数据库名a2608--hive-tableHive表名hive_emp-m并行度-m 44个并发6.4 并行迁移原理bash# 指定主键和并行度 sqoop import \ --connect jdbc:mysql://... \ --table emp \ --split-by id \ # 按id字段切分 -m 4 # 4个并发 # Sqoop会生成4个查询 # SELECT * FROM emp WHERE id 1 AND id 2500 # SELECT * FROM emp WHERE id 2500 AND id 5000 # SELECT * FROM emp WHERE id 5000 AND id 7500 # SELECT * FROM emp WHERE id 7500 AND id 100006.5 批量迁移所有表bash#!/bin/bash # 获取MySQL中所有表名 mysql -e use lee;show tables; | grep -v Tables_in_lee | while read line; do sqoop import \ --connect jdbc:mysql://192.168.5.100:3306/lee \ --username root \ --password 123456 \ --table $line \ --fields-terminated-by \t \ --hive-import \ --hive-overwrite \ --create-hive-table \ --delete-target-dir \ --hive-database a2608 \ --hive-table hive__${line} \ # 加前缀 -m 1 done七、数据验证的完整方案7.1 行数验证最简单sql-- MySQL SELECT COUNT(*) FROM t_chongzhi; -- Hive SELECT COUNT(*) FROM hive_chongzhi;7.2 关键指标验证sql-- 验证金额总和 -- MySQL SELECT SUM(amount) FROM t_chongzhi; -- Hive SELECT SUM(amount) FROM hive_chongzhi; -- 验证唯一值数量 SELECT COUNT(DISTINCT user_id) FROM t_user; SELECT COUNT(DISTINCT user_id) FROM hive_user;7.3 全量MD5验证最严谨bash# 导出MySQL数据并计算MD5 mysql -e SELECT * FROM t_chongzhi ORDER BY id mysql_data.txt md5sum mysql_data.txt # 导出Hive数据并计算MD5 hive -e SELECT * FROM hive_chongzhi ORDER BY id hive_data.txt md5sum hive_data.txt # 对比两个MD5值7.4 自动化验证脚本bash#!/bin/bash # 配置 MYSQL_TABLEt_chongzhi HIVE_TABLEhive_chongzhi DBa2608 # 1. 行数对比 mysql_count$(mysql -e SELECT COUNT(*) FROM $MYSQL_TABLE | tail -1) hive_count$(hive -e SELECT COUNT(*) FROM $DB.$HIVE_TABLE | tail -1) if [ $mysql_count -eq $hive_count ]; then echo ✅ 行数一致: $mysql_count else echo ❌ 行数不一致: MySQL$mysql_count, Hive$hive_count exit 1 fi # 2. 金额总和对比 mysql_sum$(mysql -e SELECT SUM(amount) FROM $MYSQL_TABLE | tail -1) hive_sum$(hive -e SELECT SUM(amount) FROM $DB.$HIVE_TABLE | tail -1) if [ $mysql_sum $hive_sum ]; then echo ✅ 金额总和一致: $mysql_sum else echo ❌ 金额总和不一致: MySQL$mysql_sum, Hive$hive_sum fi echo ✅ 数据验证通过八、面试重点背下来Q1你们做过数据迁移吗怎么做的做过。我们当时要把MySQL的业务库迁移到Hive数仓。主要分三步模型迁移在Hive建同样的表注意数据类型和分区数据迁移用Sqoop并行导入设置合理的并行度数据验证对比行数、关键指标、抽样内容Q2Sqoop和DataX的区别维度SqoopDataX作者Apache阿里支持数据库多MySQL/Oracle/PostgreSQL更丰富30性能高高社区活跃国内活跃Q3数据量很大TB级怎么迁移用Sqoop并行-m 参数设置10-20个并发按日期分批迁移如每天的数据单独迁移避开业务高峰期凌晨执行用压缩传输--compressQ4迁移过程中数据不一致怎么办先暂停迁移找出不一致的行用JOIN对比分析原因类型转换字符集修复后重新迁移这部分数据全部验证通过后再切换业务Q5你们迁移的频次历史数据一次性迁移全量增量数据按天同步每天凌晨九、你今天必须动手做的练习练习1Sqoop单表迁移bash# 1. 确认MySQL有测试表 mysql -uroot -p123456 -e SELECT * FROM lee.t_chongzhi # 2. 用Sqoop迁移到Hive sqoop import \ --connect jdbc:mysql://192.168.5.100:3306/lee \ --username root \ --password 123456 \ --table t_chongzhi \ --hive-import \ --hive-database a2608 \ --hive-table hive_chongzhi \ --fields-terminated-by \t \ -m 1 # 3. 验证Hive表 hive -e SELECT * FROM a2608.hive_chongzhi练习2编写验证脚本bash# 写一个脚本对比MySQL和Hive的行数 # 提示用mysql -e 和 hive -e 获取count练习3处理增量数据bash# 假设每天有新数据怎么只迁移昨天的数据 # 提示用--where参数 sqoop import \ --where dt 2025-05-28 \ --table t_chongzhi 总结数据迁移核心要点text┌─────────────────────────────────────────────┐ │ 数据迁移三步走 │ ├─────────────────────────────────────────────┤ │ 1. 模型迁移 │ │ → 数据类型、分区、存储格式、字符集 │ ├─────────────────────────────────────────────┤ │ 2. 数据迁移 │ │ → 小数据Shell脚本 │ │ → 大数据Sqoop/DataX并行 │ ├─────────────────────────────────────────────┤ │ 3. 数据验证 │ │ → 行数对比、指标对比、内容抽样、MD5全量 │ └─────────────────────────────────────────────┘ 你现在需要做什么确认教室环境Sqoop是否已安装bashwhich sqoop sqoop version跑通Sqoop示例把MySQL的t_chongzhi表迁移到Hive把报错或结果发我我帮你解决告诉我Sqoop命令执行成功了吗Hive里有数据了吗行数对比一致吗

相关新闻