Gandiva:基於 LLVM 的 Apache Arrow 分析表達式編譯器


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

今天我們很高興宣布,Apache Arrow 的 Gandiva Initiative,一個基於 LLVM 的執行核心,現在已成為 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 建構和執行 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 的更多技術細節,您可以查看以下一些資源