订阅更新

同样的SQL在Hive跑10分钟在Spark跑2分钟——Spark为什么更快?

Spark手册 第 9 题 约 3 分钟读完

本文目录
  1. 先说结论
  2. 用一个例子解释差异
  3. 实战数据对比
  4. 那Hive还有存在的价值吗?
  5. 总结

先说结论

Spark比Hive MapReduce快在5个层面:

① 中间结果不落盘 —— MapReduce每个Job之间通过HDFS传递,Spark在内存中管道化传递

② DAG执行引擎 —— Hive把复杂SQL拆成多个串行MapReduce Job,Spark生成一个DAG并行执行

③ Catalyst优化器 —— 上一篇讲的谓词下推、列裁剪、Join重排序等自动优化

④ Tungsten代码生成 —— 全阶段代码生成,避免虚函数调用开销

⑤ 内存管理优化 —— 统一内存管理,二进制内存布局,减少GC

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

详细讲解

这是一个非常经典的面试题。很多人只能说“Spark是内存计算”,但这个回答很粗糙。实际上Spark快在很多方面,“内存计算”只是其中一部分。今天拆解每一个“快的原因”。

用一个例子解释差异

-- 同样的SQL,Hive MapReduce vs Spark
SELECT country, SUM(amount)
FROM orders o JOIN users u ON o.user_id = u.id
WHERE o.dt = '2025-03-15'
GROUP BY country
ORDER BY SUM(amount) DESC;

Hive MapReduce的执行方式:

Job 1:Join——读数据→Shuffle→Join→写HDFS

Job 2:GROUP BY——仏HDFS读→Shuffle→聚合→写HDFS

Job 3:ORDER BY——仏HDFS读→Shuffle→排序→写结果

三个Job串行执行,中间结果写HDFS两次、读HDFS两次。

Spark的执行方式:

生成一个DAG,拆成三个Stage(按Shuffle边界划分)。Stage之间的数据通过内存传递,不写HDFS。而且可能自动把Join变成Broadcast Join(如果users表足够小),减少一次Shuffle。

实战数据对比

我在出海硬件公司迁移到Databricks时,做过一次系统性的性能对比(同样的数据、同样的SQL、同样的集群资源):

场景Hive on MRSpark SQL提升
简单聚合(GROUP BY)8分钟1.5分钟5.3×
多表Join + 聚合25分钟4分钟6.3×
复杂ETL(4层转换)45分钟8分钟5.6×
小表Join大表12分钟40秒18×(Broadcast)

小表Join大表的场景提升最明显,因为Spark自动用了Broadcast Join完全避免了Shuffle。

那Hive还有存在的价值吗?

有。Hive MetaStore仍然是元数据管理的核心(Spark也读Hive MetaStore)。而且Hive的生态更成熟,很多调度工具、元数据管理工具都是围绕Hive建设的。现在的主流架构是“用Hive MetaStore管元数据 + 用Spark引擎执行”。

总结

Spark快在5个层面:中间结果不落盘、DAG并行执行、Catalyst优化、Tungsten代码生成、内存管理。不是简单的“内存计算”四个字。面试时能拆解每一个层面,再加一个性能对比的实战数据,就很有深度。

下一篇聊一个Spark 3.0的重磅功能:AQE开了以后作业快了3倍——自适应查询执行是怎么回事?

你们的Hive作业迁到Spark后效果怎么样?评论区聊聊~

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

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