Gandiva:基于 LLVM 的 Apache Arrow 分析表达式编译器
已发布 2018年12月5日
作者 Jacques Nadeau (jacques)
今天,我们很高兴地宣布,Apache Arrow 的 Gandiva 计划,一个基于 LLVM 的执行内核,现在是 Apache Arrow 项目的一部分。Gandiva 由 Dremio 友情捐赠,它最初是在 Dremio 开发并开源的。Gandiva 扩展了 Arrow 的功能,以提供高性能的分析执行,它由两个主要组件组成
-
一个利用 LLVM 的运行时表达式编译器
-
一个高性能的执行环境
Gandiva 的工作原理如下:应用程序将表达式树提交给编译器,该表达式树以一种与语言无关的基于 protobuf 的表达式表示形式构建。然后,Gandiva 将表达式树编译为当前运行时环境和硬件的原生代码。编译完成后,Gandiva 执行内核将使用并生成 Arrow 列式批处理。生成的代码针对现代 CPU 上的并行处理进行了高度优化。例如,在 AVX-128 处理器上,Gandiva 可以在单个向量化操作中处理 8 对 2 字节值,而在 AVX-512 处理器上,Gandiva 可以在单个操作中处理 4 倍的值。Gandiva 从头开始构建,以理解 Arrow 的内存中表示形式并针对其优化处理。
虽然 Gandiva 在 Arrow 社区中才刚刚起步,但它已经支持数百个 表达式,从数学函数到 case 语句。Gandiva 是一个构建在核心 Apache Arrow 代码库之上的独立 C++ 库,并通过 C++ 和 Java API 提供了用于投影和过滤操作的构造和执行 API。Arrow 社区已经在寻求扩展 Gandiva 的功能。这将包括合并更多操作并支持许多新的语言绑定。例如,多个社区成员已经在积极构建新的语言绑定,允许在 Python 和 Ruby 中使用 Gandiva。
虽然 Gandiva 在 Arrow 社区中还很年轻,但它已经作为 Dremio 执行引擎的一部分交付给许多 Dremio 客户并在生产环境中使用。实验表明,在许多 SQL 查询中,性能提高了 70 倍。我们预计在许多其他利用 Arrow 的项目中也会看到类似的性能提升。
Arrow 社区正在努力发布第一个正式的包含 Gandiva 的 Apache Arrow 版本,我们希望它能在接下来的几个月内发布。这将使更广泛的分析和数据科学开发社区更容易在各种环境和项目中利用运行时代码生成来进行高性能数据处理。
几年前,我们启动了 Arrow 项目,目标是为分析创建一个行业标准的列式内存数据表示。在短短的时间内,Apache Arrow 已被数十种开源和商业软件产品采用。一些关键示例包括 Apache Spark、Pandas、Nvidia RAPIDS、Dremio 和 InfluxDB 等技术。这一成功推动 Arrow 现在每月下载量超过 100 万次。超过 200 名开发人员已经为 Apache Arrow 做出了贡献。如果您有兴趣为 Gandiva 或 Apache Arrow 项目的任何其他部分做出贡献,请随时通过邮件列表与我们联系并加入我们!
有关 Gandiva 的更多技术细节,您可以查看以下一些资源