Sqoop是Apache开源工具,专用于关系型数据库(如MySQL)与Hadoop(HDFS/Hive)间的数据传输。
核心功能包括:
典型应用场景:
- 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 完成常见的数据迁移任务了。

