Sqoop 快速入门指南(在关系型数据库之间高效批量传输数据)

Sqoop是Apache开源工具,专用于关系型数据库(如MySQL)与Hadoop(HDFS/Hive)间的数据传输。


核心功能包括:

  1. 数据导入(import):支持全表导入、条件过滤(WHERE)、自定义SQL查询,可指定分隔符和压缩格式
  2. 数据导出(export):将HDFS数据写回关系库
  3. Hive集成:直接导入数据到Hive表并自动建表
  4. 增量导入:支持基于ID递增(append)和时间戳(lastmodified)两种模式
  5. 常用管理命令:数据库/表查看、作业管理等

典型应用场景:

  • MySQL→HDFS全量迁移
  • HDFS→MySQL数据回写
  • 增量数据同步
  • 与Hive数据仓库集成

注意事项:需配置JDBC驱动、注意字符编码问题,并行导入时需指定切分字段。通过-m参数控制并行度,split-by指定分片键,可显著提升传输效率。


Sqoop 快速入门指南

Sqoop 是 Apache 开源的数据迁移工具,专门用于在关系型数据库(如 MySQL)和 Hadoop(HDFS/Hive)之间高效批量传输数据。

Sqoop 本身并没有官方的、专门为其开发的图形化操作界面软件


Sqoop 本质上是一个将导入/导出命令翻译成 MapReduce 程序的命令行工具。


这个特点部分来自于其早期设计定位,也与其运行机制(每个任务都独立提交、没有服务端进程)有关。


不过,在大数据生态中,有几个优秀的工具可以通过图形化方式来操作和管理 Sqoop 任务。


Hue (Hadoop User Experience)是一个开源的 Apache Hadoop UI 系统,它集成了Sqoop 2 编辑器,提供图形化界面来创建和管理数据迁移任务。(配置太麻烦,放弃)


Pentaho 是一个大数据分析平台,它的可视化设计工作室(Visual Design Studio)已将 Sqoop 功能集成到图形界面中。(商用,要钱)


Kettle 是绿色免安装的,直接在 Windows 上解压就能用。(推荐)


一、核心命令结构

Sqoop 主要提供两个核心命令:import(导入到 HDFS/Hive)和 export(导出到 MySQL)。

bash

复制代码
# 导入:MySQL → HDFS/Hive
sqoop import \
  --connect jdbc:mysql://host:port/database \
  --username user \
  --password pass \
  --table table_name \
  --target-dir /hdfs/path

# 导出:HDFS/Hive → MySQL
sqoop export \
  --connect jdbc:mysql://host:port/database \
  --username user \
  --password pass \
  --table table_name \
  --export-dir /hdfs/path

二、导入操作(MySQL → HDFS)

1. 全量导入整个表

将 MySQL 的 employees 表完整导入到 HDFS:

bash

复制代码
sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table employees \
  --target-dir /user/mumu/employees \
  -m 4 \
  --split-by id

参数说明:

参数 说明
-m / --num-mappers 并行 Map 任务数,默认 4
--split-by 切分字段(通常是主键),用于并行导入
--target-dir HDFS 目标目录
--fields-terminated-by 字段分隔符,默认逗号

2. 指定分隔符和压缩

bash

复制代码
sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  -P \
  --table employees \
  --target-dir /user/mumu/employees \
  --fields-terminated-by '\t' \
  --compress \
  --compression-codec snappy \
  -m 4

-P 会提示你交互式输入密码,比直接在命令行写更安全。

3. 条件导入(WHERE 过滤)

只导入部门编号为 10 的员工:

bash

复制代码
sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table employees \
  --where "dept_id = 10" \
  --target-dir /user/mumu/employees_dept10

4. 自定义 SQL 导入

bash

复制代码
sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --query "SELECT id, name, salary FROM employees WHERE salary > 50000 AND \$CONDITIONS" \
  --split-by id \
  --target-dir /user/mumu/high_salary

注意 :使用 --query 时,必须指定 --target-dir,且查询中必须包含 \$CONDITIONS 占位符。


三、导入到 Hive

直接导入到 Hive 表,省去手动建表:

bash

复制代码
sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table employees \
  --hive-import \
  --hive-table testdb.employees \
  --create-hive-table \
  -m 4

参数说明:

参数 作用
--hive-import 启用 Hive 导入
--hive-table 指定目标 Hive 表(可带数据库名)
--create-hive-table 自动创建 Hive 表
--hive-overwrite 覆盖已有数据

四、导出操作(HDFS → MySQL)

将 HDFS 中的数据写回 MySQL:

bash

复制代码
sqoop export \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table employees_backup \
  --export-dir /user/mumu/employees \
  --input-fields-terminated-by ',' \
  -m 4

参数说明:

参数 说明
--export-dir HDFS 数据目录
--input-fields-terminated-by HDFS 文件的字段分隔符
--update-key 指定主键列,执行更新而非插入
--update-mode updateonlyallowinsert

五、增量导入

1. Append 模式(基于递增 ID)

bash

复制代码
sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table orders \
  --incremental append \
  --check-column id \
  --last-value 1000 \
  --target-dir /user/mumu/orders

只导入 id > 1000 的新数据。

2. LastModified 模式(基于时间戳)

bash

复制代码
sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table orders \
  --incremental lastmodified \
  --check-column update_time \
  --last-value "2024-01-01 00:00:00"

只导入 update_time 晚于指定时间的数据。


六、常用命令速查

命令 说明
sqoop list-databases 列出数据库
sqoop list-tables 列出表
sqoop eval 执行 SQL 并查看结果
sqoop job --create 创建保存的作业
sqoop job --list 列出已有作业
sqoop job --exec 执行作业

示例:列出数据库

bash

复制代码
sqoop list-databases \
  --connect jdbc:mysql://localhost:3306/ \
  --username root \
  --password 123456

七、常见问题

错误 解决方案
ClassNotFoundException JDBC 驱动未放入 $SQOOP_HOME/lib
Connection refused 检查 MySQL 服务状态和网络连通性
Access denied 确认用户名和密码正确
Hive 找不到表 确认 Hive 已启动且表存在
MySQL 乱码 连接 URL 添加 ?useUnicode=true&characterEncoding=utf-8

掌握上面的命令后,你就能用 Sqoop 完成常见的数据迁移任务了。

相关推荐
Irene19912 天前
正确停止 Sqoop 任务:yarn application -kill(直接 kill 进程会触发重启,且可能导致状态不一致)
hadoop·sqoop
Irene19914 天前
Sqoop 安装完整教程(基于 WSL2 + Ubuntu 24.04)
hadoop·ubuntu·sqoop
WL_Aurora13 天前
Sqoop数据迁移工具从入门到精通
hive·hadoop·sqoop
网络工程小王2 个月前
【大数据技术详解】——Sqoop技术(学习笔记)
大数据·学习·sqoop
小邓睡不饱耶4 个月前
Sqoop 实战:数据迁移核心案例、优化技巧与企业级落地
hive·hadoop·sqoop
飞Link5 个月前
【Sqoop】Sqoop 使用教程:从原理到实战的完整指南
数据库·hadoop·sqoop
德彪稳坐倒骑驴5 个月前
Sqoop入门常用命令
数据库·hadoop·sqoop
Justice Young5 个月前
Sqoop复习笔记
hadoop·笔记·sqoop
走遍西兰花.jpg5 个月前
sqoop的导入导出
hive·hadoop·sqoop