Bootstrap

Apache Gluten背景、解决问题、方案都有哪些

Apache Gluten 是近年来为解决 Spark 在 CPU 密集型场景下的性能瓶颈而诞生的开源项目,其核心思路是通过本地化(Native)引擎优化 Spark 的执行效率。以下从背景、核心问题及解决方案三个维度进行解析:


一、背景与需求

  1. 硬件进步暴露 JVM 性能短板
    随着 SSD 和万兆网卡的普及,IO 性能大幅提升,传统 Spark 作业的瓶颈逐渐从 IO 转向 CPU。然而,基于 JVM 的 Spark 在 CPU 指令级优化(如 SIMD)和内存管理(如 GC 开销)方面存在天然劣势。
    示例:Databricks 的 Photon 项目验证了 Native 引擎可提升 3-10 倍性能,但闭源特性限制了其普及。

  2. Native 引擎生态与 Spark 生态割裂
    ClickHouse、Velox 等 Native 引擎虽具备高性能,但需用户迁移现有 Spark 架构,带来高昂的运维和迁移成本。用户亟需一种无需迁移即可集成 Native 引擎的方案。

  3. 社区协作推动技术革新
    Gluten 由 Intel、Kyligence 和 BIGO 等公司联合研发,旨在通过开源社区推动 Native 引擎与 Spark 的深度融合,填补 Photon 闭源后的技术空白。


二、核心问题

  1. CPU 计算效率低下
    Spark 基于 JVM 的执行引擎难以充分利用现代 CPU 特性(如向量化指令),导致计算密集型任务(如聚合、Join)性能受限。

  2. Shuffle 阶段的性能损耗
    传统行式 Shuffle 在 Native 引擎中需频繁转换行列格式,引入额外序列化开销。

  3. 生态兼容性挑战
    Native 引擎需无缝融入 Spark 的优化器、资源调度和容错机制,同时支持现有算子的回退机制。


三、解决方案与技术特性

  1. 插件化架构与 Substrait 计划转换

    • 通过 Spark 插件机制拦截物理计划,将其转换为 Substrait 格式(基于 Protobuf 的跨语言序列化协议),交由 Velox 或 ClickHouse 等后端执行。
    • 不支持的算子自动回退(Fallback)至原生 Spark 执行,保障兼容性。
  2. 本地化执行优化

    • 向量化计算:利用 Velox/ClickHouse 的向量化引擎,通过 SIMD 指令加速数据处理。
    • 统一内存管理:协调 JVM 与 Native 内存池,支持内存不足时触发 Spill,避免 OOM。
  3. 列式 Shuffle(Columnar Shuffle)

    • 采用 Arrow 格式序列化数据,避免行列转换开销,结合 Hash-based 算法减少小文件问题,TPC-H 测试中 Shuffle 大小减少 12%。
  4. 多后端引擎支持

    • 支持 Velox(Meta 开源)和 ClickHouse(OLAP 优化)双引擎,用户可根据场景选择:
      Velox:适合统一查询执行层,Meta、Intel 等公司主导;
      ClickHouse:适合 OLAP 场景,BIGO 等公司深度优化。
  5. 云原生集成
    与 Apache Celeborn 集成,通过 Remote Shuffle Service 解决本地 Shuffle 的存算耦合问题,提升弹性和稳定性。


四、实际效果与展望

  • 性能提升:生产环境中 ETL 任务成本降低 40%+,TPC-H 测试单查询最高加速 14.5 倍。
  • 未来方向:优化低基数字段聚合性能、扩展 AQE 支持、增强云原生兼容性。

Gluten 通过技术创新与生态整合,为 Spark 用户提供了“无感”性能升级路径,成为 Native 引擎与大数据框架融合的标杆实践。

五、Spark集成

Apache Gluten 与 Spark 的集成主要通过插件化架构实现,以下是从部署配置到优化调优的完整指南:


1、基础集成步骤

  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 分别对应不同构建)

  2. 后端引擎选择
    通过配置选择 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
    
  3. 内存配置优化
    调整 Native 与 JVM 内存比例(建议 Native 占 70%):

    spark.memory.offHeap.size=20g
    spark.gluten.memory.allocator.reserved=2g
    spark.gluten.memory.task.ratio=0.7
    

2、性能调优配置

  1. 向量化执行加速
    启用列式处理和 SIMD 优化:

    spark.sql.inMemoryColumnarStorage.enabled=true
    spark.sql.parquet.filterPushdown=true
    spark.gluten.sql.columnar.batchscan.enabled=true
    
  2. Shuffle 优化
    使用 Columnar Shuffle 减少序列化开销:

    spark.shuffle.manager=org.apache.spark.shuffle.sort.ColumnarShuffleManager
    spark.gluten.sql.columnar.shuffle.prefer.direct=true
    
  3. 动态回退机制
    配置不支持的算子自动回退至原生 Spark:

    spark.gluten.sql.fallback.strategy=auto
    spark.gluten.sql.fallback.threshold=3
    

3、验证与测试

  1. 功能验证
    执行 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
    
  2. 性能对比
    使用 Spark UI 观察以下指标:

    • Stage Duration(执行阶段耗时)
    • Shuffle Read/Write(数据传输量)
    • GC Time(JVM 垃圾回收时间)

4、生产环境最佳实践

  1. 资源隔离
    在 YARN/K8s 中为 Native 进程预留资源:

    spark.executor.resource.amount=1
    spark.executor.resource.gluten.amount=1
    
  2. 监控告警
    集成 Prometheus 监控 Native 内存使用:

    spark.metrics.conf.*.sink.prometheus.class=org.apache.spark.metrics.sink.PrometheusSink
    spark.gluten.metrics.enabled=true
    
  3. 版本兼容性
    当前支持矩阵:

    Spark 版本Gluten 版本支持后端
    3.3.x1.0.xCH/VL(部分)
    3.5.x1.1.xCH/VL(完整)

5、常见问题排查

  1. Native OOM 错误
    检查内存配置比例,增加 spark.gluten.memory.task.ratio

  2. 算子回退频繁
    查看日志中的 Fallback occurred 警告,更新 Gluten 版本或改写 SQL

  3. 性能未达预期
    确认是否启用 Columnar Shuffle,检查数据倾斜情况


通过以上步骤,开发者可将 Gluten 深度集成至 Spark 作业中,实现平均 2-5 倍的性能提升。建议从测试环境逐步验证,重点关注 Shuffle 和内存相关的配置调优。