订阅更新

把MySQL数据导入到Hive,有哪些方案?

MySQL手册 第 14 题 约 3 分钟读完

本文目录
  1. 先说结论
  2. 方案一:Sqoop/DataX全量拉取
  3. 方案二:增量拉取
  4. 方案三:Binlog实时同步
  5. 实战经验:我的选择
  6. 总结

先说结论

方案原理延迟适用场景
Sqoop/DataX全量拉取直接JDBC查询MySQL写入HiveT+1(天级)小表、变更不频繁
Sqoop/DataX增量拉取按时间字段只拉取变更部分T+1(天级)大表、有更新时间字段
Binlog实时同步Canal/Debezium解析Binlog实时同步秒级到分钟级实时性要求高

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

这是大数据开发最常做的事情之一。业务数据在MySQL里,但数据分析要在Hive/Spark里做。怎么把数据同步过去?有三种主流方案,各有优缺点。

方案一:Sqoop/DataX全量拉取

最简单的方案,每天把整张MySQL表拉一遍到Hive。

# DataX示例:全量拉取MySQL表到Hive
# reader: mysqlreader(JDBC查询MySQL)
# writer: hdfswriter(写入HDFS/Hive表)

优点: 简单可靠,逻辑清晰。

缺点: 数据量大时慢(每次拉全量),对MySQL主库压力大。我们通常从从库拉取,避免影响主库。

方案二:增量拉取

按更新时间字段只拉取昨天变更的数据:

-- 只拉取昨天变更的数据
SELECT * FROM orders
WHERE updated_at >= '2025-03-14 00:00:00'
  AND updated_at < '2025-03-15 00:00:00';

前提: 表必须有updated_at字段,且每次更新都会修改这个字段。

坑: 如果有物理删除(DELETE),增量拉取感知不到删除操作。解决方案:用软删除(加is_deleted字段)或用Binlog方案。

方案三:Binlog实时同步

就是上一篇讲的MySQL → Canal → Kafka → Flink → Hive/Doris架构。

优点: 实时性好,能感知删除操作,对MySQL几乎无压力。

缺点: 架构复杂,需要维护Canal/Debezium、Kafka、Flink等多个组件。

实战经验:我的选择

元宇宙社交App: 小表用DataX全量拉取,大表用Canal Binlog实时同步。

出海硬件公司: 全部用Debezium + Kafka实时同步到Databricks。

当前短剧出海公司: 阿里云DataWorks自带的MySQL数据集成,支持全量和增量。

总结

小表全量拉取,大表增量拉取或Binlog实时同步。选择依据是数据量和实时性要求。面试时能说清楚三种方案的优缺点和适用场景,再结合自己的实战经验,就很完整。

下一篇聊一个越来越重要的场景:MySQL 8.0有哪些值得关注的新特性?生产环境升级要注意什么?

你们是用什么方案同步MySQL到大数据平台的?评论区聊聊~

关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长

刷题进度保存在当前浏览器