菜鸟科技网

Sqoop命令行有哪些常用操作及参数?

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

Sqoop命令行有哪些常用操作及参数?-图1
(图片来源网络,侵删)

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 更新模式(allowinsertupdateonly,默认为 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命令行有哪些常用操作及参数?-图2
(图片来源网络,侵删)
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 映射为 IntegerVARCHAR 映射为 StringDATETIME 映射为 String(可通过 --map-column-java 手动指定映射类型,如 --map-column-java id=Long)。

常见问题与优化

  1. 导入速度慢:可通过增加 --m 并行度、优化数据库查询(如添加索引)、调整 HDFS 块大小等方式提升性能。
  2. 导出失败:检查目标表是否存在、字段是否匹配、数据库连接权限是否充足,以及 --update-key 是否正确指定。

相关问答 FAQs

问题 1:Sqoop 导入数据时如何避免密码明文暴露?
解答:可通过 --password-file 参数从文件中读取密码,文件需为 HDFS 上的普通文本文件,且权限设置为仅当前用户可读。sqoop import --password-file /user/password.txt为纯密码字符串(如 123456),无需额外格式。

Sqoop命令行有哪些常用操作及参数?-图3
(图片来源网络,侵删)

问题 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 会同步该时间之后的数据。
分享:
扫描分享到社交APP
上一篇
下一篇