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 的更多技术详情,您可以查看以下一些资源: