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 靠作业位点或人工维护,漏跑一次就会出现数据空洞且不易发现。