首页
概述
Gluten:一个将基于 JVM 的 SQL 引擎执行卸载到原生引擎的中间层。
1 引言
1.1 问题陈述
Apache Spark 是一个稳定、成熟的项目,已经过多年的持续开发。它是横向扩展以处理 PB 级数据集的最佳框架之一。然而,随着时间的推移,Spark 社区不得不应对各种性能挑战,这些挑战需要进行多方面的优化。作为 Spark 2.0 中的一项关键优化,全阶段代码生成(Whole Stage Code Generation)被引入以取代火山模型(Volcano Model),从而实现了 2 倍的加速。自此之后,大多数优化都停留在查询计划层面,单个算子的性能几乎停止了增长。

另一方面,SQL 引擎已经过多年的研究。目前已经有一些库,例如 Clickhouse、Arrow 和 Velox 等。借助原生实现、列式数据格式和向量化数据处理等特性,这些库的性能可以超过 Spark 基于 JVM 的 SQL 引擎。然而,这些库仅支持单节点执行。
1.2 Gluten 的解决方案
“Gluten” 在拉丁语中意为“胶水”。Gluten 项目的主要目标是将原生库与 SparkSQL “粘合”在一起,从而使我们既能受益于 Spark SQL 框架的高可扩展性,又能获得原生库的高性能。
Gluten 设计的基本原则是:复用 Spark 的完整控制流以及尽可能多的 JVM 代码,但将计算密集型的数据处理部分下推到原生代码中执行。Gluten 所做的事情如下:
- 将 Spark 的 whole stage 物理计划转换为 Substrait 计划并发送到原生层
- 将对性能至关重要的数据处理下推到原生库执行
- 为原生库定义清晰的 JNI 接口
- 轻松切换可用的原生后端
- 复用 Spark 的分布式控制流
- 管理 JVM 与原生层之间的数据共享
- 可扩展,以支持更多原生加速器
1.3 目标用户
Gluten 的目标用户是任何希望从根本上加速 SparkSQL 的人。作为 Spark 的插件,Gluten 不需要对 DataFrame API 或 SQL 查询做任何改动,只需要用户进行正确的配置即可。Gluten 配置属性请参见 here。
1.4 参考资料
你可以点击以下链接获取更多信息。
- Gluten Intro Video at Data AI Summit 2022
- Gluten Intro Article at Medium.com
- Gluten Intro Article at Kyligence.io(in Chinese)
- Velox Intro from Meta
2 架构
整体概览图如下所示。Substrait 为数据计算操作提供了一套定义良好的跨语言规范(更多详情请参见 here)。Spark 物理计划被转换为 Substrait 计划,然后 Substrait 计划通过 JNI 调用传递给原生层。在原生侧,将构建原生算子链并下推到原生引擎中执行。Gluten 将 Columnar Batch 返回给 Spark,并在执行时使用 Spark Columnar API(自 Spark-3.0 起提供)。Gluten 采用 Apache Arrow 数据格式作为其基本数据格式,因此返回给 Spark JVM 的数据是 ArrowColumnarBatch。

目前,Gluten 仅支持 ClickHouse 后端和 Velox 后端。Velox 是一个 C++ 数据库加速库,提供可复用、可扩展且高性能的数据处理组件。更多详细信息可参见 https://github.com/facebookincubator/velox/.。Gluten 也可以扩展以支持更多后端。
Gluten 包含以下几个关键组件:
- 查询计划转换(Query Plan Conversion):将 Spark 的物理计划转换为 Substrait 计划。
- 统一内存管理(Unified Memory Management):控制原生内存分配。
- 列式 Shuffle(Columnar Shuffle):对 Gluten 的列式数据进行 shuffle。shuffle 服务仍然复用 Spark core 中的实现,并实现了一种列式 exchange 算子以支持 Gluten 的列式数据格式。
- 回退机制(Fallback Mechanism):支持在遇到不支持的算子时回退到原生 Spark。Gluten 的 ColumnarToRow(C2R)和 RowToColumnar(R2C)会在需要时转换 Gluten 的列式数据与 Spark 的内部行式数据。C2R 和 R2C 同样以原生代码实现。
- 指标(Metrics):从 Gluten 原生引擎中采集,用于帮助定位缺陷、性能瓶颈等问题。这些指标会展示在 Spark UI 中。
- 适配层(Shim Layer):支持多个 Spark 版本。我们计划仅支持 Spark 最近的 3-4 个发行版本。目前支持 Spark 3.4、3.5、4.0 和 4.1。
评论
登录后参与评论
KnowForge