利用 Gluten 和 Velox 加速 AArch64 上的 Spark SQL

作者:安谋科技 (Arm China) 主任软件工程师 Yuqi Gu

如今,不仅数据量空前增长,对数据的洞察和发掘也呈现出惊人的潜力。然而,其中涉及到海量的计算,会对性能提出严峻的挑战。

Apache Spark 是当下流行的开源数据处理引擎,主要用于批处理、机器学习 (ML)、流处理和大规模 SQL,旨在加速和简化大数据处理。Apache Spark SQL 为用户提供可靠的解决方案,以便高效处理大型数据集。随着 Apache Spark 的不断发展,带来了 Spark SQL 及 Datasets 和 DataFrames 的新抽象方式,相比于 Spark 的低层 RDD,提供了更为直观且更强大的编程方法。此外,Apache Spark 的 Catalyst 引擎会自动优化 Spark SQL 代码,以提高执行速度。

作为一个经过多年发展的成熟项目,Spark 是处理 PB 级数据集的主要框架之一。与此同时,部分企业发现有机会将 Spark 发展成为向量化 SQL 引擎,从而解决基于行的数据处理和 JVM 限制问题。日前,Gluten 项目作为基于 Apache-Arrow 的原生 SQL 引擎正式亮相,旨在增强 Spark SQL。多个向量化 SQL 引擎及更加活跃的开源社区也纷纷涌现。其中,由 Meta 主导的 Velox 项目引人瞩目,它可提供向量化数据库加速库。

image.png

Gluten 和 Velox 插件

Gluten 源自拉丁语,意为胶水,充当 Apache Spark 和向量化 SQL 引擎或库之间的桥梁(图 1)。通过将向量化 SQL 引擎或共享库与 Spark 集成,可获得许多优化机会。其中包括将函数和算子转发并下推到向量化库中,引入即时编译引擎,以及启用 GPU 和 FPGA 等硬件加速器。通过 Gluten 项目,用户能够利用这些软硬件优势提升 Spark 性能。

image.png
图 1:Gluten 架构

Gluten 项目利用 Spark 框架的许多方面,如资源分配和 Catalyst 逻辑计划优化器。此外,Gluten 引入新组件来管理 JVM 和原生库之间的 API。

Gluten Fallback

Gluten 利用 Spark JVM 引擎来确定原生库是否支持某些算子。如果不支持,Gluten 会默认使用基于 Spark-JVM 的现有算子。这个 Fallback 过程会产生在列格式和行格式之间数据转换的开销。

Gluten Query Plan 转换

Gluten 利用 Substrait.io 来构建查询计划树。它将 Spark physical plan 转换为针对每个后端定制的 Substrait plan,然后通过 JNI 与 Substrait plan 通信,以启动原生库中的执行管线。Substrait 格式用于描述结构化数据上的计算操作,旨在确保各种语言和系统之间的互操作性。Substrait 的目标是为数据计算操作建立清晰的跨语言规范。更多详情,请访问 https://substrait.io

Gluten 统一内存管理

Gluten 利用 Spark 现有的内存管理系统,为高效处理内存运算提供强大的框架。每次需要分配或释放原生内存时,Gluten 都会调用 Spark JVM 内存注册 API,以确保与底层系统无缝集成。Spark 的内存管理系统旨在为每个任务线程细致地管理内存。如果一个线程需要比当前分配更多的内存,并且所使用的算子支持这种功能,它可以调用 spill() 接口。此外,Spark 的全面内存管理系统具有防止内存泄漏和内存不足问题的机制,即使在高工作负载条件下也能确保稳定可靠的性能。

  • 内存池保存一个内存块
  • 如果不够,从任务内存管理器获取
  • 如果任务没有足够的内存,就会发生溢出(见图 2)

image.png
图 2:Gluten 内存管理

Gluten 列式 Shuffle

Gluten 使用其前代产品 Gazelle 的基于 Apache Arrow 的列式 shuffle 管理器,作为默认 shuffle 管理器。第三方库用于管理从原生到 Arrow 的数据转换,或者开发者可以创建自己的 shuffle 管理器。

Gluten Shim Layer

为了与 Spark 无缝集成,Gluten Shim Layer 支持多个版本的 Spark。Gluten 与 Spark 3.x 版及更高版本兼容。

Gluten Metrics

Gluten 支持 Spark 的 metrics 功能。Spark 的默认 metrics 专注于基于行的 Java 数据处理,而 Gluten 项目在此基础之上,通过基于列的 API 和其他 metrics 进行了扩展,有助于更好地使用 Gluten,并为开发者提供调试这些原生库的工具。

Velox 和原生库

Velox 是 Meta 开发并开源的统一执行引擎,旨在增强数据管理系统并简化这些系统的开发。Velox 的主要优势之一能够整合和统一数据管理系统,因此无需重复执行引擎重写。Velox 是 C++ 数据库加速库,提供可复用、可扩展且高性能的数据处理组件。这些组件可通过复用,来构建侧重于不同分析工作负载的计算引擎,包括批处理、交互式、流处理和 AI/ML 工作负载。Velox 集成到 Spark 中,用作 Gluten 的原生后端。如图 3 所示,Gluten 使得 C++ 执行引擎 (Velox) 能够在 Spark 环境中操作,以便运行 Spark SQL 查询。它通过使用基于 Apache Arrow 数据格式和 Substrait 查询计划的 JNI API,将 Spark JVM 与执行引擎分离开来。得益于该集成,Velox 能够通过 Gluten 的 JNI API 在 Spark 中运行。

image.png
图 3:Gluten 和 Velox 后端

AArch64 上的性能指标

对于 Gluten,我们支持 AArch64 上的第三方依赖项 libhdfs3[1]。我们还添加了对 AArch64 架构 CPU 的检测 (Arm Neoverse N1/N2/V1),并调整了相应的编译选项。此外,在 Velox 中,我们修复了早期 Arm 平台上的非法指令 (core dumped) 问题[2]。

添加了 TPC-DS 基准测试脚本[3]后,我们使用 TPC-DS 基准套件[4]评估了 Spark Java 引擎和 Gluten 和 Velox 后端在基于 AArch64 架构的 Neoverse N2 上的性能。

下图(图 4)显示了通过使用类似 TPC-DS 工作负载的 60 多个查询,Gluten 和 Velox 后端与 Spark Java 引擎在 Neoverse N2 上的性能比较,并附上了 Gluten 插件的 Spark 配置。

image.png
图 4:比较 Gluten 和 Velox 后端与 Spark Java 引擎
在 Neoverse N2 上的性能

要点

  • Gluten 与 Velox 集成实现了执行决策支持查询所需的函数和算子。
  • 通过比较 Gluten 和 Velox 与 Spark Java 引擎,采用 Velox 后端的 Gluten 的性能在单次查询中可提升高达 83%。
  • Gluten 集成了 Meta 主导的 Velox 向量化执行引擎。Apache Spark 用户有望在 AArch64 上实现性能改进和资源效率提升。

总结

Gluten 和 Velox 取得了重大进步,能够为 Arm 平台上的 Spark SQL 加速器提供高效的解决方案。借由 Gluten 和 Velox 实现的技术,Spark-SQL 可在 AArch64 上获得超过基于行的数据处理性能,并突破 JVM 限制,通过利用 AArch64 SIMD 高效指令和向量化执行能力的垂直组合性实现了这一点。实验结果凸显了该 Spark SQL 方法在 Neoverse N2 上的潜力。

相关链接:

[1] https://github.com/oap-projec...

     https://github.com/apache/inc...

[2] https://github.com/facebookin...

https://github.com/apache/inc...

[3] https://github.com/apache/inc...

[4] https://www.tpc.org/tpcds/def...

本文为 Arm 原创文章,转载请留言联系获得授权并注明出处。
作者:Yuqi Gu
文章来源:Arm社区

推荐阅读

推荐阅读
关注数
23561
内容数
1012
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息