Apache Gluten 是近年来为解决 Spark 在 CPU 密集型场景下的性能瓶颈而诞生的开源项目,其核心思路是通过本地化(Native)引擎优化 Spark 的执行效率。以下从背景、核心问题及解决方案三个维度进行解析:
一、背景与需求
-
硬件进步暴露 JVM 性能短板
随着 SSD 和万兆网卡的普及,IO 性能大幅提升,传统 Spark 作业的瓶颈逐渐从 IO 转向 CPU。然而,基于 JVM 的 Spark 在 CPU 指令级优化(如 SIMD)和内存管理(如 GC 开销)方面存在天然劣势。
示例:Databricks 的 Photon 项目验证了 Native 引擎可提升 3-10 倍性能,但闭源特性限制了其普及。 -
Native 引擎生态与 Spark 生态割裂
ClickHouse、Velox 等 Native 引擎虽具备高性能,但需用户迁移现有 Spark 架构,带来高昂的运维和迁移成本。用户亟需一种无需迁移即可集成 Native 引擎的方案。 -
社区协作推动技术革新
Gluten 由 Intel、Kyligence 和 BIGO 等公司联合研发,旨在通过开源社区推动 Native 引擎与 Spark 的深度融合,填补 Photon 闭源后的技术空白。
二、核心问题
-
CPU 计算效率低下
Spark 基于 JVM 的执行引擎难以充分利用现代 CPU 特性(如向量化指令),导致计算密集型任务(如聚合、Join)性能受限。 -
Shuffle 阶段的性能损耗
传统行式 Shuffle 在 Native 引擎中需频繁转换行列格式,引入额外序列化开销。 -
生态兼容性挑战
Native 引擎需无缝融入 Spark 的优化器、资源调度和容错机制,同时支持现有算子的回退机制。
三、解决方案与技术特性
-
插件化架构与 Substrait 计划转换
- 通过 Spark 插件机制拦截物理计划,将其转换为 Substrait 格式(基于 Protobuf 的跨语言序列化协议),交由 Velox 或 ClickHouse 等后端执行。
- 不支持的算子自动回退(Fallback)至原生 Spark 执行,保障兼容性。
-
本地化执行优化
- 向量化计算:利用 Velox/ClickHouse 的向量化引擎,通过 SIMD 指令加速数据处理。
- 统一内存管理:协调 JVM 与 Native 内存池,支持内存不足时触发 Spill,避免 OOM。
-
列式 Shuffle(Columnar Shuffle)
- 采用 Arrow 格式序列化数据,避免行列转换开销,结合 Hash-based 算法减少小文件问题,TPC-H 测试中 Shuffle 大小减少 12%。
-
多后端引擎支持
- 支持 Velox(Meta 开源)和 ClickHouse(OLAP 优化)双引擎,用户可根据场景选择:
Velox:适合统一查询执行层,Meta、Intel 等公司主导;
ClickHouse:适合 OLAP 场景,BIGO 等公司深度优化。
- 支持 Velox(Meta 开源)和 ClickHouse(OLAP 优化)双引擎,用户可根据场景选择:
-
云原生集成
与 Apache Celeborn 集成,通过 Remote Shuffle Service 解决本地 Shuffle 的存算耦合问题,提升弹性和稳定性。
四、实际效果与展望
- 性能提升:生产环境中 ETL 任务成本降低 40%+,TPC-H 测试单查询最高加速 14.5 倍。
- 未来方向:优化低基数字段聚合性能、扩展 AQE 支持、增强云原生兼容性。
Gluten 通过技术创新与生态整合,为 Spark 用户提供了“无感”性能升级路径,成为 Native 引擎与大数据框架融合的标杆实践。
五、Spark集成
Apache Gluten 与 Spark 的集成主要通过插件化架构实现,以下是从部署配置到优化调优的完整指南:
1、基础集成步骤
-
依赖引入
在 Spark 的spark-defaults.conf
中添加 Gluten 插件依赖:spark.jars.packages=org.apache.gluten:gluten-spark3.5_2.12:1.1.0 spark.plugins=org.apache.gluten.GlutenPlugin
注:需根据 Spark 版本选择适配的 Gluten 包(如 Spark 3.3/3.4/3.5 分别对应不同构建)
-
后端引擎选择
通过配置选择 Velox 或 ClickHouse 后端:# Velox 后端 spark.gluten.sql.enable.native.engine=velox spark.gluten.sql.velox.execution.mode=auto # ClickHouse 后端 spark.gluten.sql.enable.native.engine=ch spark.gluten.sql.ch.worker.id=ch01
-
内存配置优化
调整 Native 与 JVM 内存比例(建议 Native 占 70%):spark.memory.offHeap.size=20g spark.gluten.memory.allocator.reserved=2g spark.gluten.memory.task.ratio=0.7
2、性能调优配置
-
向量化执行加速
启用列式处理和 SIMD 优化:spark.sql.inMemoryColumnarStorage.enabled=true spark.sql.parquet.filterPushdown=true spark.gluten.sql.columnar.batchscan.enabled=true
-
Shuffle 优化
使用 Columnar Shuffle 减少序列化开销:spark.shuffle.manager=org.apache.spark.shuffle.sort.ColumnarShuffleManager spark.gluten.sql.columnar.shuffle.prefer.direct=true
-
动态回退机制
配置不支持的算子自动回退至原生 Spark:spark.gluten.sql.fallback.strategy=auto spark.gluten.sql.fallback.threshold=3
3、验证与测试
-
功能验证
执行 TPC-H 基准测试(需下载数据集):./bin/spark-submit --class org.apache.gluten.tpch.TpchQuery \ gluten/tpch/target/gluten-tpch-1.1.0.jar \ --data-location hdfs://path/to/tpch-data \ --query 1,6,12 --backend velox
-
性能对比
使用 Spark UI 观察以下指标:- Stage Duration(执行阶段耗时)
- Shuffle Read/Write(数据传输量)
- GC Time(JVM 垃圾回收时间)
4、生产环境最佳实践
-
资源隔离
在 YARN/K8s 中为 Native 进程预留资源:spark.executor.resource.amount=1 spark.executor.resource.gluten.amount=1
-
监控告警
集成 Prometheus 监控 Native 内存使用:spark.metrics.conf.*.sink.prometheus.class=org.apache.spark.metrics.sink.PrometheusSink spark.gluten.metrics.enabled=true
-
版本兼容性
当前支持矩阵:Spark 版本 Gluten 版本 支持后端 3.3.x 1.0.x CH/VL(部分) 3.5.x 1.1.x CH/VL(完整)
5、常见问题排查
-
Native OOM 错误
检查内存配置比例,增加spark.gluten.memory.task.ratio
值 -
算子回退频繁
查看日志中的Fallback occurred
警告,更新 Gluten 版本或改写 SQL -
性能未达预期
确认是否启用 Columnar Shuffle,检查数据倾斜情况
通过以上步骤,开发者可将 Gluten 深度集成至 Spark 作业中,实现平均 2-5 倍的性能提升。建议从测试环境逐步验证,重点关注 Shuffle 和内存相关的配置调优。