Sqoop是Apache开源工具,专用于关系型数据库(如MySQL)与Hadoop(HDFS/Hive)间的数据传输。
核心功能包括:
- 数据导入(import):支持全表导入、条件过滤(WHERE)、自定义SQL查询,可指定分隔符和压缩格式
- 数据导出(export):将HDFS数据写回关系库
- Hive集成:直接导入数据到Hive表并自动建表
- 增量导入:支持基于ID递增(append)和时间戳(lastmodified)两种模式
- 常用管理命令:数据库/表查看、作业管理等
典型应用场景:
- 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 |
updateonly 或 allowinsert |
五、增量导入
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 完成常见的数据迁移任务了。