Acero 概觀#

本頁概述 Acero 的基本概念,並協助區分 Acero 與 Arrow 程式碼庫中的其他模組。本頁適用於使用者、開發人員、潛在貢獻者,以及希望擴展 Acero 以進行研究或商業用途的人員。本頁假設讀者已熟悉核心 Arrow 概念。本頁不要求具備關聯式代數的任何現有知識。

什麼是 Acero?#

Acero 是一個 C++ 函式庫,可用於分析大型(可能無限)的資料串流。Acero 允許將計算表示為「執行計畫」(ExecPlan)。執行計畫接受零或多個輸入資料串流,並發出單一輸出資料串流。該計畫描述資料在傳輸過程中將如何轉換。例如,一個計畫可能

  • 使用通用欄合併兩個資料串流

  • 透過評估針對現有欄的運算式來建立額外欄

  • 透過以分割佈局將資料串流寫入磁碟來使用它

A sample execution plan that joins three streams of data and writes to disk

Acero 不是…#

資料科學家函式庫#

Acero 並不打算直接由資料科學家使用。預期終端使用者通常會使用某種前端。例如,Pandas、Ibis 或 SQL。Acero 的 API 專注於功能和可用的演算法。然而,這些使用者可能有興趣更深入了解 Acero 的運作方式,以便他們更好地理解其函式庫的後端處理如何運作。

資料庫#

資料庫(或 DBMS)通常是一個更廣泛的應用程式,並且通常封裝為獨立服務。Acero 可能是資料庫中的一個組件(大多數資料庫都有某種執行引擎),或者可能是某些其他幾乎不像資料庫的資料處理應用程式中的一個組件。Acero 不關心使用者管理、外部通訊、隔離、持久性或一致性。此外,Acero 主要專注於讀取路徑,而寫入工具缺乏任何形式的交易支援。

最佳化器#

Acero 沒有 SQL 剖析器。它沒有查詢規劃器。它沒有任何形式的最佳化器。Acero 希望獲得關於如何操作資料的非常詳細和低階的指示,然後它將完全按照描述執行該操作。

建立最佳執行計畫非常困難。小細節可能會對效能產生重大影響。我們確實認為最佳化器很重要,但我們認為它應該獨立於 acero 實作,希望透過 Substrait 等標準以可組合的方式實作,以便任何後端都可以利用它。

分散式#

Acero 不提供分散式執行。然而,Acero 的目標是可以被分散式查詢執行引擎使用。換句話說,Acero 不會配置和協調工作者,但它確實希望被用作工作者。有時,區別有點模糊。例如,Acero 來源可能是能夠執行篩選或其他進階分析的智慧型儲存裝置。人們可能會認為這是一個分散式計畫。關鍵的區別在於 Acero 不具備將邏輯計畫轉換為分散式執行計畫的能力。該步驟需要在其他地方完成。

Acero 與…#

Arrow 計算#

這在 與 Arrow C++ 的關係 中有更詳細的描述,但主要區別在於 Acero 處理資料串流,而 Arrow Compute 處理所有資料都在記憶體中的情況。

Arrow 資料集#

Arrow 資料集函式庫提供了一些基本常式,用於發現、掃描和寫入檔案集合。資料集模組依賴於 Acero。掃描和寫入資料集都使用 Acero。掃描節點和寫入節點是資料集模組的一部分。這有助於將檔案格式和檔案系統的複雜性排除在核心 Acero 邏輯之外。

Substrait#

Substrait 是一個為查詢計畫建立標準的專案。Acero 執行查詢計畫並產生資料。這使得 Acero 成為 Substrait 消費者。搭配 Substrait 使用 Acero 中有關於 Substrait 功能的更多詳細資訊。

Datafusion / DuckDb / Velox / 等#

正在出現許多柱狀資料引擎。我們認為這是一件好事,並鼓勵像 Substrait 這樣的專案來幫助允許在引擎之間根據需要進行切換。我們通常不鼓勵比較基準測試,因為它們幾乎不可避免地會受到工作負載的驅動,並且很少能夠捕捉到蘋果對蘋果的比較。對每個引擎的優缺點的討論超出了本指南的範圍。

與 Arrow C++ 的關係#

Acero 模組是 Arrow C++ 實作的一部分。它作為一個單獨的模組建置,但它依賴於核心 Arrow 模組,並且不能獨立存在。Acero 使用並擴展了核心 Arrow 模組和 Arrow 計算核心的功能。

A diagram of layers with core on the left, compute in the middle, and acero on the right

核心 Arrow 函式庫為緩衝區和陣列提供容器,這些容器根據 Arrow 柱狀格式佈局。除了少數例外情況外,核心 Arrow 函式庫不檢查或修改緩衝區的內容。例如,將字串陣列從小寫字串轉換為大寫字串不會是核心 Arrow 函式庫的一部分,因為這需要檢查陣列的內容。

計算模組擴展了核心函式庫,並提供了分析和轉換資料的函式。計算模組的功能都透過函式註冊表公開。Arrow「函式」接受零或多個陣列、批次或表格,並產生陣列、批次或表格。此外,函式呼叫可以與欄位參考和常值結合,以形成運算式(函式呼叫樹),計算模組可以評估該運算式。例如,給定一個包含欄 xy 的表格,計算 x + (y * 3)

A sample expression tree

Acero 透過為資料串流新增計算操作來擴展這些功能。例如,投影節點可以在批次串流上應用計算運算式。這將建立一個新的批次串流,其中運算式的結果作為新欄新增。這些節點可以組合成一個圖,以形成更複雜的執行計畫。這與將函式組合成樹以形成複雜運算式的方式非常相似。

A simple plan that uses compute expressions

注意

Acero 不使用核心 Arrow 函式庫中的 arrow::Tablearrow::ChunkedArray 容器。這是因為 Acero 在批次串流上運作,因此不需要多批次資料容器。這有助於降低 Acero 的複雜性,並避免因欄具有不同區塊大小的表格而引起的棘手情況。Acero 通常會使用 arrow::Datum,它是核心模組的一個變體,可以容納許多不同的類型。在 Acero 中,datum 將始終包含 arrow::Arrayarrow::Scalar

核心概念#

ExecNode#

Acero 中最基本的概念是 ExecNode。一個 ExecNode 有零或多個輸入和零或一個輸出。如果一個 ExecNode 有零個輸入,我們稱之為來源節點,如果一個 ExecNode 沒有輸出,那麼我們稱之為接收節點。有許多不同種類的節點,每個節點都以不同的方式轉換其輸入。例如

  • 掃描節點是一個來源節點,它從檔案讀取資料

  • 聚合節點累積資料批次以計算摘要統計資訊

  • 篩選節點根據篩選運算式從資料中移除列

  • 表格接收節點將資料累積到表格中

注意

可用計算模組的完整列表包含在使用者指南

ExecBatch#

資料批次由 ExecBatch 類別表示。ExecBatch 是一個 2D 結構,它與 RecordBatch 非常相似。它可以有零或多個欄,並且所有欄都必須具有相同的長度。ExecBatch 與 RecordBatch 有一些關鍵差異

../../_images/rb_vs_eb.svg

RecordBatch 和 ExecBatch 都對陣列和緩衝區具有強所有權#

  • 一個 ExecBatch 沒有結構描述。這是因為一個 ExecBatch 被假定為批次串流的一部分,並且該串流被假定為具有一致的結構描述。因此,ExecBatch 的結構描述通常儲存在 ExecNode 中。

  • ExecBatch 中的欄可以是 ArrayScalar。當一個欄是 Scalar 時,這表示該欄對於批次中的每一列都只有一個值。一個 ExecBatch 也具有一個長度屬性,用於描述批次中有多少列。因此,查看 Scalar 的另一種方式是具有 length 個元素的常數陣列。

  • 一個 ExecBatch 包含執行計畫使用的其他資訊。例如,可以使用 index 來描述批次在有序串流中的位置。我們預期 ExecBatch 也會演變為包含其他欄位,例如選擇向量。

../../_images/scalar_vs_array.svg

有四種不同的方式可以使用陣列和純量的不同組合來表示給定的資料批次。所有四個 ExecBatch 都應被視為語義上等效。#

從 RecordBatch 轉換為 ExecBatch 始終為零複製。RecordBatch 和 ExecBatch 都指向完全相同的底層陣列。僅當 ExecBatch 中沒有純量時,從 ExecBatch 轉換為 RecordBatch 才為零複製。

注意

Acero 和計算模組都有批次和陣列的「輕量級」版本。在計算模組中,這些版本稱為 BatchSpanArraySpanBufferSpan。在 Acero 中,這個概念稱為 KeyColumnArray。這些類型是同時開發的,並且用途相同。它們旨在提供一個可以完全堆疊分配的陣列容器(前提是資料類型是非巢狀的),以避免堆積分配開銷。理想情況下,這兩個概念將在某一天合併。

ExecPlan#

ExecPlan 表示 ExecNode 物件的圖。一個有效的 ExecPlan 必須始終至少有一個來源節點,但從技術上講,它不需要有接收節點。ExecPlan 包含所有節點共用的資源,並具有用於控制節點執行開始和停止的工具函式。ExecPlan 和 ExecNode 都與單次執行的生命週期相關聯。它們具有狀態,並且不希望可重新啟動。

警告

Acero 中的結構,包括 ExecBatch,仍處於實驗階段。ExecBatch 類別不應在 Acero 外部使用。相反,ExecBatch 應轉換為更標準的結構,例如 RecordBatch

同樣地,ExecPlan 是一個內部概念。建立計畫的使用者應使用 Declaration 物件。用於使用和執行計畫的 API 應抽象化底層計畫的詳細資訊,而不公開物件本身。

Declaration#

Declaration 是 ExecNode 的藍圖。Declaration 可以組合成一個圖,以形成 ExecPlan 的藍圖。Declaration 描述需要完成的計算,但實際上不負責執行計算。透過這種方式,Declaration 類似於運算式。預計 Declaration 將需要與各種查詢表示形式(例如 Substrait)相互轉換。Declaration 物件是公共 API,與 DeclarationToXyz 方法結合,是 Acero 當前的公共 API。

../../_images/decl_vs_ep.svg

Declaration 是用於實例化執行計畫實例的藍圖#