首页/数据/数据工程与 ETL 速查/Sqoop 增量导入与退出维护
CDC 与同步53 条

Sqoop 增量导入与退出维护

Sqoop 是 Hadoop 生态的 RDBMS 导入导出工具:import 把表搬进 HDFS/Hive,支持 --incremental append(按自增列)与 lastmodified(按时间列)做增量。项目已进入 Apache Attic 停止演进,新项目多改用 DataX、Spark 或 Flink 作业替代。

Sqoop 是什么

Sqoop 是 Hadoop 生态的关系型数据库批量搬运工具:import 把 RDBMS 表导入 HDFS/Hive,export 反向写出,底层把命令翻译成 MapReduce 作业并行抽取。增量导入靠 --incremental append(按自增列取新增行)或 lastmodified(按时间列取新增与更新)。项目已进入 Apache Attic 停止演进,新链路多改用 DataX、Spark 或 Flink 作业替代,但存量集群里仍大量存在。

基本信息

适用平台Hadoop 生态(依赖 HDFS 与 MapReduce/YARN)
维护状态已进入 Apache Attic,修复与新特性停滞
连接方式JDBC(--connect/--username/--password-file)
并行度-m 指定 map 数,--split-by 指定切分列
增量方式--incremental append 或 lastmodified,配合 --check-column 与 --last-value
位点管理业务侧手工维护,或用 sqoop job 保存作业与上一次取值

典型使用场景

  • 存量系统数据入湖:把业务库表首次全量搬到 HDFS/Hive
  • 按自增主键做增量抽取:只取 id 大于上次位点的新行,成本最低
  • 按更新时间列抽增量:能捕获 UPDATE,适合有可靠更新时间字段的表
  • 数据回灌:把 Hive 计算结果导出回关系库供报表系统读取
  • 定期归档:把历史表按范围抽到离线存储后从库中清理

增量 append 导入

增量 append 导入
sqoop import --connect jdbc:mysql://10.0.0.5:3306/app \
  --username ro_user --password-file /home/hadoop/.sqoop.pwd \
  --table orders \
  --target-dir /warehouse/ods/orders \
  --incremental append --check-column id --last-value 100000 \
  --split-by id -m 4 \
  --fields-terminated-by '\001' \
  --null-string '\\N' --null-non-string '\\N'   # 明确空值表示,避免与字符串 N 混淆

按时间列增量与保存作业

按时间列增量与保存作业
sqoop import --connect jdbc:mysql://10.0.0.5:3306/app \
  --username ro_user --password-file /home/hadoop/.sqoop.pwd \
  --table orders --target-dir /warehouse/ods/orders \
  --incremental lastmodified --check-column updated_at \
  --last-value '2026-10-11 00:00:00' \
  --merge-key id                  # 同主键合并,避免更新产生重复行

# 用 job 保存位点,避免每次手工传 --last-value
sqoop job --create job_orders_inc -- import --connect jdbc:mysql://10.0.0.5:3306/app ...
sqoop job --exec job_orders_inc    # 执行后自动更新 --last-value

两种增量模式对照

模式捕获范围前提条件
append只捕获新增行check-column 为递增列(自增主键或时间戳单调递增)
lastmodified捕获新增与更新行check-column 为时间列且有索引,避免全表扫描
lastmodified + --append追加式装载,更新行不回改历史适合只关心最新值的场景
lastmodified + --merge-key按主键合并,更新覆盖旧值需要 MapReduce 合并步骤,成本更高
两种增量模式都捕获不到 DELETE:目标端的删除同步需要额外机制(如全量对比、CDC 或业务侧下发删除清单)。把 Sqoop 当作完整同步方案会长期漏数据。
把 Sqoop 当实时同步是常见误解:它是批式导入,延迟以调度周期计;--last-value 靠作业位点或人工维护,漏跑一次就会出现数据空洞且不易发现。

易错点

  • 手工维护 --last-value,漏跑或写错一次就产生数据空洞,事后很难补齐
  • 把 Sqoop 当实时同步使用,业务侧按秒级延迟预期消费,结果对不上
  • check-column 选无可索引的时间列,lastmodified 增量变成全表扫描拖慢源库
  • 未设置空值表示参数,数据库中 NULL 与字符串 N 在导出后无法区分
  • -m 与 --split-by 选错:split-by 用非数值或分布极不均的列,导致数据倾斜、单任务长时间不结束

数据来源与参考

  • Apache Sqoop 官方文档(User Guide:Incremental Imports)
  • Apache Attic(Sqoop 项目状态)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌