Gandiva:一个基于 LLVM 的 Apache Arrow 分析表达式编译器


已发布 2018年12月05日
作者 Jacques Nadeau (jacques)

今天我们很高兴地宣布,基于 LLVM 的执行内核 Apache Arrow 的 Gandiva Initiative 现在是 Apache Arrow 项目的一部分。 Gandiva 由 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 是一个独立的 C++ 库,构建在 Apache Arrow 核心代码库之上,并捐赠了 C++ 和 Java 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 的更多技术细节,您可以查看以下资源