Sqoop 是一个用于在 Hadoop 和关系型数据库之间传输数据的工具,它通过命令行接口提供了丰富的功能,支持将关系型数据库中的数据导入 Hadoop 分布式文件系统(HDFS)、Hive、HBase 等系统,同时也支持将 Hadoop 中的数据导出到关系型数据库,Sqoop 命令行工具的核心是通过一系列参数来控制数据导入导出的行为,其基本语法结构为 sqoop <command> [options]
,<command>
为具体的操作命令(如 import
、export
等),[options]
为可选参数,用于配置连接信息、数据格式、并行度等细节。

Sqoop 命令行核心操作
数据导入(import)
数据导入是 Sqoop 最常用的功能之一,主要用于将关系型数据库中的表数据迁移到 Hadoop 生态系统中,以下是 import
命令的关键参数及说明:
参数 | 说明 | 示例 |
---|---|---|
--connect |
数据库连接字符串,包含 JDBC 协议、主机名、端口、数据库名等信息 | --connect jdbc:mysql://localhost:3306/test |
--username |
数据库用户名 | --username root |
--password |
数据库密码(可通过 --password-file 从文件中读取,避免明文暴露) |
--password 123456 |
--table |
要导入的源表名 | --table emp |
--target-dir |
HDFS 中的目标目录(若未指定,默认存入 /user/<username>/<table_name> ) |
--target-dir /data/emp |
--fields-terminated-by |
指定字段分隔符(默认为 \001 ,与 Hive 兼容) |
--fields-terminated-by ',' |
--lines-terminated-by |
指定行分隔符(默认为 \n ) |
--lines-terminated-by '\n' |
--m 或 --num-mappers |
并行执行的 Map 任务数量(影响导入速度,通常设置为与数据库连接数相关) | --m 4 |
--query 或 --e |
自定义 SQL 查询导入(需配合 --target-dir 使用,且 SQL 中需包含 $CONDITIONS 占位符) |
--query "SELECT * FROM emp WHERE dept_id=1 AND \$CONDITIONS" |
--as-textfile |
导出为文本格式(默认格式) | --as-textfile |
--as-sequencefile |
导出为 SequenceFile 格式(二进制,适合大数据量) | --as-sequencefile |
--hive-import |
直接导入 Hive 表(需提前创建 Hive 表结构) | --hive-import |
--hive-table |
指定目标 Hive 表名(配合 --hive-import 使用) |
--hive-table emp_hive |
示例: 将 MySQL 中的 emp
表导入 HDFS 的 /data/emp
目录,使用 4 个 Map 任务并行执行,字段以逗号分隔:
sqoop import \ --connect jdbc:mysql://localhost:3306/test \ --username root \ --password 123456 \ --table emp \ --target-dir /data/emp \ --fields-terminated-by ',' \ --m 4
数据导出(export)
数据导出与导入相反,用于将 HDFS 中的数据导出到关系型数据库。export
命令的关键参数如下:
参数 | 说明 | 示例 |
---|---|---|
--connect |
同导入,数据库连接字符串 | --connect jdbc:mysql://localhost:3306/test |
--username |
数据库用户名 | --username root |
--password |
数据库密码 | --password 123456 |
--table |
目标表名(需提前存在) | --table emp_export |
--export-dir |
HDFS 中源数据目录 | --export-dir /data/emp |
--input-fields-terminated-by |
指定输入字段分隔符(需与 HDFS 文件格式一致) | --input-fields-terminated-by ',' |
--input-lines-terminated-by |
指定输入行分隔符 | --input-lines-terminated-by '\n' |
--update-mode |
更新模式(allowinsert 或 updateonly ,默认为 updateonly ) |
--update-mode allowinsert |
--update-key |
指定更新依据的主键列(多列用逗号分隔) | --update-key emp_id |
--call |
通过存储过程导出(需指定存储过程名) | --call export_emp_proc |
示例:将 HDFS 中 /data/emp
目录的 CSV 数据导出到 MySQL 的 emp_export
表,允许插入新数据,更新依据为 emp_id
列:

sqoop export \ --connect jdbc:mysql://localhost:3306/test \ --username root \ --password 123456 \ --table emp_export \ --export-dir /data/emp \ --input-fields-terminated-by ',' \ --update-mode allowinsert \ --update-key emp_id
其他常用命令
list-databases
:列出数据库服务器中的所有数据库。sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456
list-tables
:列出指定数据库中的所有表。sqoop list-tables --connect jdbc:mysql://localhost:3306/test --username root --password 123456
eval
:执行 SQL 查询并显示结果,用于测试 SQL 语句正确性。sqoop eval --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --query "SELECT COUNT(*) FROM emp"
Sqoop 命令行高级特性
并行控制
通过 --m
参数可调整 Map 任务数量,提高数据导入导出效率,但需注意:数据库连接数需足够支持并行任务,否则可能导致连接失败,MySQL 默认最大连接数为 151,若 --m
设置为 200,则可能因连接不足而报错。
增量导入
增量导入仅同步新增或变更的数据,适用于全量数据同步后的增量更新,可通过以下两种方式实现:
--incremental append
:基于自增列(如 ID)导入新增数据,需指定--check-column
为自增列名。sqoop import --connect ... --table emp --check-column emp_id --incremental append --last-value 1000
--incremental lastmodified
:基于时间戳列导入变更数据,需指定--last-value
为上次同步的时间戳。sqoop import --connect ... --table emp --check-column update_time --incremental lastmodified --last-value "2023-01-01 00:00:00"
数据类型映射
Sqoop 会自动将关系型数据库的数据类型映射为 Hadoop 中的数据类型,MySQL 的 INT
映射为 Integer
,VARCHAR
映射为 String
,DATETIME
映射为 String
(可通过 --map-column-java
手动指定映射类型,如 --map-column-java id=Long
)。
常见问题与优化
- 导入速度慢:可通过增加
--m
并行度、优化数据库查询(如添加索引)、调整 HDFS 块大小等方式提升性能。 - 导出失败:检查目标表是否存在、字段是否匹配、数据库连接权限是否充足,以及
--update-key
是否正确指定。
相关问答 FAQs
问题 1:Sqoop 导入数据时如何避免密码明文暴露?
解答:可通过 --password-file
参数从文件中读取密码,文件需为 HDFS 上的普通文本文件,且权限设置为仅当前用户可读。sqoop import --password-file /user/password.txt
为纯密码字符串(如 123456
),无需额外格式。

问题 2:Sqoop 增量导入时,--last-value
的值如何确定?
解答:--last-value
的值取决于增量模式:
- 若为
append
模式(基于自增列),需查询源表中该列的最大值,如SELECT MAX(emp_id) FROM emp
,将结果作为--last-value
的值。 - 若为
lastmodified
模式(基于时间戳),需记录上次同步的时间点,如上次同步时间为2023-10-01 12:00:00
,则--last-value
设为该时间戳,Sqoop 会同步该时间之后的数据。