Spark 比 Hive 快的主要原因在于其内存计算架构和先进的执行引擎优化,核心区别如下:
-
执行引擎:
- Hive (默认): 基于 MapReduce。MapReduce 每个阶段(Map, Shuffle, Reduce)都需要将中间结果写入磁盘,后续阶段再从磁盘读取,频繁的磁盘 I/O 是最大瓶颈。
- Spark: 使用基于内存的弹性分布式数据集。只要内存足够,计算过程中的中间结果优先保留在内存中供后续操作使用,大幅减少昂贵的磁盘读写。只有内存不足或需要持久化时才溢出到磁盘。
-
执行模型:
- Hive (MapReduce): 采用多阶段模型。每个阶段(Map/Reduce)启动独立的 JVM 任务,任务启动和销毁开销大。阶段间依赖通过磁盘传递数据。
- Spark: 采用有向无环图调度。它将整个作业构建成一个 DAG,优化器能将多个操作(如连续的 Map)合并为一个 Stage 在同一个任务中执行。任务内部通过内存流水线传递数据,减少任务启动开销和数据落地次数。
-
内存管理和优化:
- Spark: 拥有统一的内存管理器,可以动态地在不同操作(执行内存、存储内存)间分配内存。支持高效的数据缓存机制,允许将热点数据持久化在内存中供多次查询复用。
- Hive (MapReduce): 内存管理相对简单,主要依赖底层系统(如 YARN),缓存能力较弱(如 LLAP 是后来增强)。
-
高级优化器:
- Spark SQL: 内置 Catalyst 优化器,支持基于规则的优化和基于代价的优化,能生成更优的执行计划。它还利用 Tungsten 引擎进行二进制处理和代码生成,减少虚拟函数调用和对象创建开销。
- Hive: 早期主要依赖规则优化器,后期也引入了 CBO,但 Spark 的优化器通常被认为更先进高效。
总结: Spark 的核心优势在于利用内存避免不必要的磁盘 I/O、通过 DAG 调度和流水线执行减少任务调度与数据落地开销、以及强大的优化器。Hive on MapReduce 的磁盘密集型多阶段模型是其性能的主要限制。