Spark Tungsten执行引擎
请介绍Spark Tungsten执行引擎的核心优化技术,它是如何提升Spark性能的?
回答
专业代码师
Tungsten定义: Spark 1.x/2.x引入的底层执行引擎,专注于CPU和内存效率的极致优化。
三大核心技术:
1. 内存管理与二进制格式:
- 使用**堆外内存(Off-Heap)**减少GC压力
- 数据以二进制格式存储在内存中(不再使用Java对象)
- 支持cache-aware计算(L1/L2/L3缓存友好)
- 使用sun.misc.Unsafe直接操作内存地址
2. 全阶段代码生成(WholeStageCodegen):
- 将多个操作(如filter→map→project)编译成一个Java函数
- 消除虚函数调用(不再一层层调用next())
- 循环展开(Loop Unrolling)
- 示例:
df.filter(col>10).select(name)编译为一段无虚函数的单循环
3. 缓存感知的排序和聚合:
- 排序: 使用排序后的数组+二分查找(对Cache友好)
- 聚合: 使用OpenHashMap变体,减少Hash冲突
- Shuffle: 使用排序后直接写内存的方式减少序列化
性能提升: | 操作 | 未使用Tungsten | 使用Tungsten | |------|---------------|--------------| | HashAggregate | 100%(基准) | 快2-5x | | Sort | 100%(基准) | 快3-6x | | 整体SQL查询 | 100%(基准) | 快2-10x |
Tungsten v2(Spark 2.x+):
- 支持更快的内存分配器
- 更好的堆外内存管理
- 支持向量化读(Parquet/ORC的向量化读取器)