本文是大数据系列第 24 篇,演示 Sqoop 与 Hive 的双向数据迁移:MySQL 导入 Hive,以及 Hive 导出回 MySQL。

完整图文版(含截图):CSDN 原文 | 掘金

实验环境

三台 2C4G 云服务器(h121、h122、h123)组成 Hadoop 集群,YARN、HDFS 和 Hive 服务均已运行,MySQL 部署在 h122。

MySQL → Hive:数据导入

1. 在 Hive 创建目标库和表

CREATE DATABASE mydb;

CREATE TABLE mydb.goodtbl (
  gname        STRING,
  serialNumber INT,
  price        INT,
  stock_number INT,
  create_time  DATE
);

2. 执行 Sqoop 导入命令

sqoop import \
  --connect jdbc:mysql://h122.wzk.icu:3306/sqoop \
  --username hive \
  --password hive@wzk.icu \
  --table goodtbl \
  --hive-import \
  --create-hive-table \
  --fields-terminated-by "\t" \
  --hive-overwrite \
  --hive-table mydb.goodtbl \
  -m 1

关键参数说明

参数说明
--hive-import指定目标为 Hive(而非直接写 HDFS)
--create-hive-table若 Hive 表不存在则自动创建(已存在则报错)
--hive-overwrite覆盖 Hive 表中的已有数据
--hive-table指定目标 Hive 表,格式为 database.table
--fields-terminated-by字段分隔符,需与 Hive 表 SerDe 配置一致
-m 1使用单个 Mapper,适合小数据量场景

执行原理

Sqoop 的 Hive 导入实际分两步进行:

  1. 先将 MySQL 数据导入 HDFS 临时目录
  2. 再通过 LOAD DATA INPATH 将临时目录数据加载到 Hive 表

因此在 YARN 上会看到一个 MapReduce Job,完成后 Hive 元数据和 HDFS 数据目录均会更新。

验证结果

-- 在 Hive 中查询确认
SELECT COUNT(*) FROM mydb.goodtbl;
SELECT * FROM mydb.goodtbl LIMIT 5;

Hive → MySQL:数据导出

1. 在 MySQL 创建目标表

CREATE TABLE sqoop.goodtbl2 (
  gname        VARCHAR(50),
  serialNumber INT,
  price        INT,
  stock_number INT,
  create_time  DATE
);

2. 执行 Sqoop 导出命令

sqoop export \
  --connect jdbc:mysql://h122.wzk.icu:3306/sqoop \
  --username hive \
  --password hive@wzk.icu \
  --table goodtbl2 \
  --num-mappers 1 \
  --export-dir /user/hive/warehouse/mydb.db/goodtbl \
  --input-fields-terminated-by "\t"

导出参数说明

参数说明
--tableMySQL 目标表名
--export-dirHive 表在 HDFS 上的实际路径
--input-fields-terminated-by读取 HDFS 文件时使用的字段分隔符
--num-mappers并行 Mapper 数(导出时每个 Mapper 执行批量 INSERT)

Hive 表的 HDFS 路径规律:/user/hive/warehouse/<database>.db/<table>。可用 DESCRIBE FORMATTED mydb.goodtbl; 在 Hive 中确认实际路径。

验证结果

-- 在 MySQL 中确认数据
SELECT COUNT(*) FROM sqoop.goodtbl2;
SELECT * FROM sqoop.goodtbl2 LIMIT 5;

常见问题

Q:--create-hive-table 报表已存在错误 A:去掉该参数,或先在 Hive 中手动 DROP TABLE。若要覆盖数据保留表结构,单独使用 --hive-overwrite

Q:Hive 查询结果出现 NULL 列 A:通常是 --fields-terminated-by 与 Hive 表定义的分隔符不一致,保持两边相同(推荐 \t\001)。

Q:导出到 MySQL 时数据乱序 A:Sqoop export 使用并行 INSERT,行顺序不保证。如有顺序需求,导入 MySQL 后再 ORDER BY


下一篇介绍 Sqoop 增量数据导入(CDC),实现只同步新增或变更数据,避免每次全量扫描。