sqoop导入

Sqoop 导入:从 MySQL 到 HDFS,全量、增量、过滤、入 Hive,四种场景一套命令

Sqoop 导入,就是从关系型数据库往 Hadoop 搬数据。

四种常见场景,按复杂度从低到高:

场景 命令关键词 适合什么时候
全量导入 --table 第一次导入,把整张表拉过来
条件导入 --where / --query 只要部分行或部分列
增量导入 --incremental 每天只导新增数据
直入 Hive --hive-import 省掉中间步骤,直接进 Hive

全量导入:整张表拉到 HDFS

最基础的用法,把 MySQL 的一张表完整导入 HDFS。

sqoop import \
  --connect jdbc:mysql://localhost:3306/company \
  --username root \
  --password 123456 \
  --table staff \
  --target-dir /user/sqoop/company \
  --delete-target-dir \
  --fields-terminated-by "\t" \
  --num-mappers 1

关键参数:

参数 说明
--table 要导的表名
--target-dir HDFS 目标目录
--delete-target-dir 目录存在就先删,避免报错(全量覆盖用)
--fields-terminated-by 字段分隔符(默认逗号)
--num-mappers 并行度,1 最稳,大表可调大

数据去哪了:

/user/sqoop/company/
  └── part-m-00000    数据文件

条件导入:只导需要的数据

全量导入把整张表都拉过来,但有时候只需要部分行或部分列。

2.1 按行过滤(--where

sqoop import \
  --table staff \
  --where "sex = 0 AND age > 18" \
  --target-dir /user/sqoop/company_filter

只导满足条件的行。

2.2 按列过滤(--columns

sqoop import \
  --table staff \
  --columns "name, age, sex" \
  --target-dir /user/sqoop/company_columns

只导指定的列,减少数据传输量。

2.3 自定义 SQL(--query,最灵活)

sqoop import \
  --query 'SELECT name, age FROM staff WHERE sex = 0 AND $CONDITIONS' \
  --target-dir /user/sqoop/company_query \
  --num-mappers 1

注意: $CONDITIONS 必须写,Sqoop 用它替换并行查询条件。缺了会报错。

增量导入:只导新增或变化的数据

全量导入只做一次,后续每天只需导新增的数据。

方式一:按递增 ID(Append 模式)

适用场景:表有自增 ID,新数据 ID 越来越大。

sqoop import \
  --table staff \
  --target-dir /user/sqoop/company \
  --incremental append \
  --check-column id \
  --last-value 1000

只导 id > 1000 的数据。last-value 是上次导入的最大 ID。

方式二:按更新时间(LastModified 模式)

适用场景:表有更新时间字段,数据修改时更新时间戳。

sqoop import \
  --table orders \
  --target-dir /user/sqoop/orders \
  --incremental lastmodified \
  --check-column update_time \
  --last-value "2024-01-01 00:00:00"

只导 update_time > 2024-01-01 的数据。

增量导入的数据会追加到 HDFS 目录,不会覆盖已有数据。

直入 Hive:省掉中间步骤

不需要先导到 HDFS 再建 Hive 表,一步到位。

sqoop import \
  --table staff \
  --hive-import \
  --hive-table staff_hive \
  --hive-overwrite \
  --fields-terminated-by "\t"

做了什么:

  1. 数据先导到 HDFS 临时目录
  2. 自动执行 LOAD DATA INPATH 把数据加载到 Hive 表

前提条件:

  • Hive 表要提前建好,或者允许 Sqoop 自动创建

  • $SQOOP_HOME/lib/ 里要有 Hive 的依赖包(hive-common.jarhive-exec.jar

常见问题

1. 导入慢

调大 --num-mappers,但别太大(数据库连接数有限)。

--batch 减少 JDBC 交互次数。

MySQL 可用 --directmysqldump 加速。

2. 数据里有分隔符导致字段错乱

--escaped-by 转义,或者换一个数据里不会出现的分隔符。

--fields-terminated-by "\001"   -- 用不可见字符做分隔符

3. 直入 Hive 报错 ClassNotFoundException

Hive 依赖包没拷全:

cp $HIVE_HOME/lib/hive-common-*.jar $SQOOP_HOME/lib/
cp $HIVE_HOME/lib/hive-exec-*.jar $SQOOP_HOME/lib/