Apache Arrow DataFusion 16.0.0 專案更新


已發布 2023年1月19日
作者 Apache Arrow PMC (pmc)

簡介

DataFusion 是一個可擴展的查詢執行框架,以 Rust 語言編寫,並使用 Apache Arrow 作為其記憶體內格式。它主要針對創建資料密集型分析的開發人員,並提供成熟的 SQL 支援、DataFrame API 和許多擴展點。

基於 DataFusion 的系統在基準測試中表現非常出色,尤其考慮到它們直接在 Parquet 檔案上操作,而不是先載入到專用格式中。最近的一些亮點包括 clickbenchCloudfuse.io 獨立查詢引擎 頁面。

DataFusion 也是長期趨勢的一部分,Andy Pavlo 在他的 2022 年資料庫回顧 中清楚地闡述了這一點。資料庫框架正在迅速普及,所有 OLAP DBMS 和其他資料密集型應用程式(例如機器學習)很可能在未來 5 年內需要向量化、高效能的查詢引擎才能保持相關性。在沒有數百萬美元投資的情況下,使此類技術如此廣泛可用的唯一實際方法是透過 DataFusion 或 Velox 等開源引擎。

本文的其餘部分介紹了 DataFusion 在過去三個月中所做的改進,以及對未來發展方向的一些提示。

社群成長

上次更新 以來,我們再次看到 DataFusion 社群的顯著成長。在 OSSRank 上有一些有趣的指標。

DataFusion 16.0.0 版本包含來自 73 位不同貢獻者的 543 個 PR,這還不包括所有投入到相依性(例如 arrowparquetobject_store)的工作,而大部分相同社群也協助支援這些相依性。感謝大家的所有幫助!

最近新增了幾個 基於 DataFusion 的新系統

效能 🚀

效能和效率是 DataFusion 的核心價值。雖然 DataFusion 與同類最佳、緊密集成的系統(例如 DuckDBPolars)之間仍然存在差距,但 DataFusion 正在快速縮小差距。以下是過去三個月的效能亮點:

  • 使用新的 Row Format,排序和合併速度提升高達 30%
  • 進階的述詞下推,直接在 Parquet 上,直接從物件儲存中,實現亞毫秒級的篩選。
  • 70% 更快的 IN 運算式評估 (#4057)
  • 感知排序和分割的最佳化 (#3969#4691)
  • 篩選器選擇性分析 (#3868)

執行階段資源限制

先前,DataFusion 可能會針對某些包含排序、分組或聯結的查詢使用無限制的記憶體量。

在 16.0.0 版本中,可以限制 DataFusion 用於排序和分組的記憶體使用量。我們正在尋求協助,為聯結添加類似的限制,並擴展我們的演算法以選擇性地溢出到輔助儲存。請參閱 #3941 以取得更多詳細資訊。

SQL 視窗函數

SQL 視窗函數 對於各種分析都很有用,而 DataFusion 的實作支援已顯著擴展

  • 自訂視窗框架,例如 ... OVER (ORDER BY ... RANGE BETWEEN 0.2 PRECEDING AND 0.2 FOLLOWING)
  • 無界視窗框架,例如 ... OVER (ORDER BY ... RANGE UNBOUNDED ROWS PRECEDING)
  • 支援 NTILE 視窗函數 (#4676)
  • 支援 GROUPS 模式 (#4155)

改進的聯結

聯結通常是在分析系統中難以妥善處理的最複雜操作,而 DataFusion 16.0.0 提供了顯著的改進,例如

  • 基於成本的最佳化器 (CBO) 自動重新排序聯結評估,根據可用的統計資料和聯結類型(INNERLEFT 等)選擇演算法(合併/雜湊)並選擇建置端 (#4219)
  • 快速的非 column=column 等值聯結,例如 JOIN ON a.x + 5 = b.y
  • 非等值聯結的效能提升 (#4562)

串流執行

DataFusion 的一個新興用例是作為串流優先資料平台的基礎。一個重要的先決條件是支援可增量計算的查詢的增量執行。

在此版本中,DataFusion 現在支援以下串流功能

  • 從無限檔案(例如 FIFO)攝取資料 (#4694),
  • 在串流用例中偵測破壞管線的查詢 (#4694),
  • 自動交換聯結的輸入,使探測端成為資料串流 (#4694),
  • 盡可能智慧地省略破壞管線的排序操作 (#4691),
  • 更多類型查詢的增量執行;例如,涉及有限視窗框架的查詢 (#4777)。

這些是向前邁出的重要一步,我們計劃在接下來的幾個版本中進行更多改進。

更好地支援分散式目錄

16.0.0 增強了對非同步目錄的支援 (#4607),以更好地支援分散式中繼資料儲存,例如 Delta.ioApache Iceberg,它們在規劃期間需要非同步 I/O 才能存取遠端目錄。先前,DataFusion 需要同步存取所有相關的目錄資訊。

額外的 SQL 支援

SQL 支援持續改進,包括以下一些重點

  • 新增 TPC-DS 查詢規劃回歸測試 #4719
  • 支援 PREPARE 陳述式 #4490
  • 日期和時間戳記之間的自動強制轉換 #4726
  • 支援時間戳記和 utf8 的類型強制轉換 #4312
  • 完全支援 time32 和 time64 常值 (ScalarValue) #4156
  • 新函數,包括 uuid() #4041current_time #4054current_date #4022
  • 壓縮的 CSV/JSON 支援 #3642

社群也投入了新的 基於 sqllogic 的 測試,以更輕鬆地持續改進 DataFusion 的品質。

計劃序列化和 Substrait

DataFusion 現在支援物理計劃的序列化,使用自訂的 Protocol Buffers 格式。此外,我們正在新增對 Substrait 的初步支援,Substrait 是一種用於關係代數的跨語言序列化。

如何參與

感謝社群中每位貢獻想法、討論、錯誤報告、文件和程式碼的人。能夠一起建立如此酷的東西真是令人興奮!

如果您有興趣貢獻 DataFusion,我們非常歡迎您加入我們。您可以嘗試在您自己的資料和專案上使用 DataFusion,並告訴我們進展如何,或者貢獻包含文件、測試或程式碼的 PR。適合初學者的開放 issue 清單 在此

請查看我們的 溝通文件,以了解更多與社群互動的方式。

附錄:貢獻者致謝

以下是在過去三個版本中為此專案貢獻 PR 的人員清單,來源於 git shortlog -sn 13.0.0..16.0.0 . 感謝大家!

   113	Andrew Lamb
    58	jakevin
    46	Raphael Taylor-Davies
    30	Andy Grove
    19	Batuhan Taskaya
    19	Remzi Yang
    17	ygf11
    16	Burak
    16	Jeffrey
    16	Marco Neumann
    14	Kun Liu
    12	Yang Jiang
    10	mingmwang
     9	Daniël Heres
     9	Mustafa akur
     9	comphead
     9	mvanschellebeeck
     9	xudong.w
     7	dependabot[bot]
     7	yahoNanJing
     6	Brent Gardner
     5	AssHero
     4	Jiayu Liu
     4	Wei-Ting Kuo
     4	askoa
     3	André Calado Coroado
     3	Jie Han
     3	Jon Mease
     3	Metehan Yıldırım
     3	Nga Tran
     3	Ruihang Xia
     3	baishen
     2	Berkay Şahin
     2	Dan Harris
     2	Dongyan Zhou
     2	Eduard Karacharov
     2	Kikkon
     2	Liang-Chi Hsieh
     2	Marko Milenković
     2	Martin Grigorov
     2	Roman Nozdrin
     2	Tim Van Wassenhove
     2	r.4ntix
     2	unconsolable
     2	unvalley
     1	Ajaya Agrawal
     1	Alexander Spies
     1	ArkashaJavelin
     1	Artjoms Iskovs
     1	BoredPerson
     1	Christian Salvati
     1	Creampanda
     1	Data Psycho
     1	Francis Du
     1	Francis Le Roy
     1	LFC
     1	Marko Grujic
     1	Matt Willian
     1	Matthijs Brobbel
     1	Max Burke
     1	Mehmet Ozan Kabak
     1	Rito Takeuchi
     1	Roman Zeyde
     1	Vrishabh
     1	Zhang Li
     1	ZuoTiJia
     1	byteink
     1	cfraz89
     1	nbr
     1	xxchan
     1	yujie.zhang
     1	zembunia
     1	哇呜哇呜呀咦耶