本文是大数据系列第 24 篇,演示 Sqoop 与 Hive 的双向数据迁移:MySQL 导入 Hive,以及 Hive 导出回 MySQL。
实验环境
三台 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 导入实际分两步进行:
- 先将 MySQL 数据导入 HDFS 临时目录
- 再通过
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"
导出参数说明
| 参数 | 说明 |
|---|---|
--table | MySQL 目标表名 |
--export-dir | Hive 表在 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),实现只同步新增或变更数据,避免每次全量扫描。