常見問題
一般
什麼是 Apache Arrow?
Apache Arrow 是一個軟體開發平台,用於建構處理和傳輸大型資料集的高效能應用程式。它旨在提高分析演算法的效能,以及提高從一個系統(或程式語言到另一個程式語言)移動資料的效率。
Apache Arrow 的一個關鍵組件是其記憶體內欄狀格式,這是一種標準化、與語言無關的規範,用於在記憶體中表示結構化、類似表格的資料集。這種資料格式具有豐富的資料類型系統(包括巢狀和使用者定義的資料類型),旨在支援分析資料庫系統、資料框架函式庫等的需求。
該專案還包含許多語言中 Arrow 欄狀格式的實作,以及用於將其讀寫到許多常見儲存格式的工具。這些官方函式庫使第三方專案能夠使用 Arrow 資料,而無需自己實作 Arrow 欄狀格式。對於那些想要實作格式的小子集的人,Arrow 專案包含一些工具,例如 C 資料介面,以協助與官方 Arrow 函式庫的互操作性。
Arrow 函式庫包含許多軟體組件,這些組件有助於解決與資料進出遠端儲存系統以及透過網路介面移動 Arrow 格式資料相關的系統問題。即使在完全不使用欄狀格式的情況下,也可以使用其中一些組件。
最後,除了有助於資料存取和 IO 相關問題的軟體之外,還有用於對 Arrow 資料集執行分析操作或查詢的演算法函式庫。
為什麼要為記憶體內欄狀資料定義標準?
傳統上,資料處理引擎開發人員會建立自訂資料結構,以在處理資料集時在記憶體中表示資料集。鑑於這些資料結構的「自訂」性質,他們還必須開發序列化介面,以在這些資料結構與不同的檔案格式、網路協定、資料庫客戶端和其他資料傳輸介面之間進行轉換。這樣做的結果是在開發人員時間和 CPU 週期上都造成了難以置信的浪費,這些週期花費在將資料從一種格式序列化為另一種格式。
Arrow 記憶體內欄狀資料格式的基本原理是為幾個相互關聯的問題提供開箱即用的解決方案
- 一種通用的表格資料表示法,在現代硬體上處理非常高效,同時也適用於廣泛的使用案例。我們相信,越來越少的系統會建立自己的資料結構,而只是使用 Arrow。
- 支援隨機存取和串流/掃描式工作負載。
- 標準化的記憶體格式有助於演算法函式庫的重複使用。當使用自訂記憶體內資料格式時,通常必須重寫通用演算法以針對這些自訂資料格式。
- 同時使用或支援 Arrow 的系統可以在它們之間傳輸資料,幾乎沒有成本。這大大減少了分析工作負載中的序列化開銷,這些開銷通常佔計算成本的 80-90%。
- Arrow 格式的與語言無關的設計使以不同程式語言(甚至在 JVM 上執行)編寫的系統能夠在沒有序列化開銷的情況下傳輸資料集。例如,Java 應用程式可以在 JVM 中產生的資料上呼叫 C 或 C++ 演算法。
專案狀態
Arrow 格式有多穩定?在我的應用程式中使用它是否安全?
Arrow 欄狀格式和協定被認為是穩定的,我們打算僅進行向後相容的變更,例如新增資料類型。它已經被許多應用程式使用,您可以相信相容性不會被破壞。有關 Arrow 格式版本控制和穩定性的詳細資訊,請參閱文件。
Arrow 函式庫有多穩定?
我們建議您參考實作矩陣。
Arrow 資料的 MIME 類型 (IANA 媒體類型)
官方 IANA 媒體類型 (MIME 類型) 已為 Apache Arrow IPC 協定資料註冊,包括串流和檔案變體
- https://www.iana.org/assignments/media-types/application/vnd.apache.arrow.stream
- https://www.iana.org/assignments/media-types/application/vnd.apache.arrow.file
我們建議將「.arrow」作為 IPC 檔案格式的副檔名
以及將「.arrows」作為 IPC 串流格式的副檔名
開始使用
我在哪裡可以取得 Arrow 函式庫?
許多語言的 Arrow 函式庫都可以透過常用的套件管理器取得。有關詳細資訊,請參閱安裝頁面。
參與其中
我有一些問題。我如何獲得幫助?
Arrow 郵件列表是提出問題的最佳場所。別害羞——我們在這裡提供協助。
我嘗試使用 Arrow,但它無法運作。您可以修復它嗎?
希望可以!請製作一份詳細的錯誤報告——這對專案本身來說是一項有價值的貢獻。請參閱貢獻指南,了解如何製作報告。
Arrow 看起來很棒,如果它只做了 X,我就會完全使用它。它什麼時候會完成?
我們使用GitHub 作為我們的 Issue Tracker。搜尋符合您需求的 issue。如果您找到一個,請隨時在上面留言並描述您的使用案例——這將有助於選擇該任務的人。如果您沒有找到,請建立一個。
最終,Arrow 是社群為了社群而編寫的軟體。如果您沒有看到社群中的其他人正在處理您的 issue,那麼完成它的最佳方法是自己投入。我們非常願意幫助您成功地為專案做出貢獻。
我如何報告安全性漏洞?
請發送電子郵件至 private@arrow.apache.org。有關更多資訊,請參閱安全性頁面。
與其他專案的關係
Apache Arrow 和 Apache Parquet 之間有什麼區別?
Parquet 不是「執行階段記憶體內格式」;一般來說,檔案格式幾乎總是必須反序列化為某種記憶體內資料結構才能進行處理。我們希望 Arrow 成為該記憶體內資料結構。
Parquet 是一種儲存格式,旨在最大限度地提高空間效率,使用先進的壓縮和編碼技術。當想要在儲存 GB 級或更多資料時最大限度地減少磁碟使用量時,它是理想的選擇。這種效率是以相對昂貴的讀取到記憶體為代價的,因為 Parquet 資料無法直接操作,而必須以大塊解碼。
相反地,Arrow 是一種記憶體內格式,主要用於直接且有效率地用於計算目的。Arrow 資料通常不壓縮,而是以 CPU 的自然格式佈局,以便可以全速存取任意位置的資料。(但是,Arrow 確實提供了一組有限的選項來提高空間效率,包括字典編碼、行程長度編碼和緩衝區壓縮。)
因此,Arrow 和 Parquet 互補,並且通常在應用程式中一起使用。使用 Parquet 將資料儲存在磁碟上,並以 Arrow 格式將其讀取到記憶體中,將使您能夠充分利用您的運算硬體。
那麼「Arrow 檔案」呢?
Apache Arrow 定義了一種進程間通訊 (IPC) 機制,用於傳輸 Arrow 欄狀陣列的集合(稱為「記錄批次」)。它可以透過使用 Arrow「串流格式」在進程之間同步使用,或者透過首先使用 Arrow「檔案格式」將資料持久儲存在儲存體上來非同步使用。
Arrow IPC 機制基於 Arrow 記憶體內格式,因此在磁碟表示和記憶體內表示之間不需要轉換。因此,對 Arrow IPC 檔案執行分析可以使用記憶體映射,避免任何反序列化成本和額外副本。
比較 Arrow IPC 檔案格式和 Parquet 格式時需要記住的一些事項
-
Parquet 專為長期儲存和歸檔目的而設計,這意味著如果您今天寫入一個檔案,您可以預期任何聲稱可以「讀取 Parquet」的系統都將能夠在 5 年或 10 年內讀取該檔案。雖然 Arrow 磁碟格式是穩定的,並且可以被未來版本的函式庫讀取,但它並不優先考慮長期歸檔儲存的需求。
-
讀取 Parquet 檔案通常需要有效率但相對複雜的解碼,而讀取 Arrow IPC 檔案不涉及任何解碼,因為磁碟表示與記憶體內表示相同。
-
由於 Parquet 使用的欄狀資料壓縮策略,Parquet 檔案通常比 Arrow IPC 檔案小得多。如果您的磁碟儲存或網路速度較慢,即使是短期儲存或快取,Parquet 也可能是更好的選擇。
那麼「Feather」檔案格式呢?
Feather v1 格式是一個簡化的自訂容器,用於在開發 Arrow IPC 檔案格式之前將 Arrow 格式的子集寫入磁碟。「Feather 版本 2」現在完全是 Arrow IPC 檔案格式,我們保留了「Feather」名稱和 API 以實現向後相容性。
Arrow 與 Protobuf 有什麼關係?
Google 的協定緩衝區函式庫 (Protobuf) 不是「執行階段記憶體內格式」。與 Parquet 類似,Protobuf 的表示形式不適合處理。資料必須反序列化為記憶體內表示形式(如 Arrow)才能進行處理。
例如,Protobuf 中的無符號整數編碼為 varint,其中每個整數可能具有不同數量的位元組,並且最後三個位元包含欄位的線路類型。您無法使用 CPU 以這種格式對數字進行加法運算。
Protobuf 具有執行此反序列化的函式庫,但它們的目標不是通用的記憶體內格式。由 protoc 產生的 C# 程式碼反序列化的訊息與由 protoc 產生的 Java 程式碼反序列化的訊息將具有不同的表示形式。您需要將資料從一種語言編組到另一種語言。
Arrow 避免了這種情況,但它以增加空間為代價。Protobuf 可能更適合在網路上序列化某些種類的資料(例如,具有許多可選欄位的個別記錄或稀疏資料)。就像 Parquet 一樣,這意味著 Arrow 和 Protobuf 可以很好地互補。例如,Arrow Flight 使用 gRPC 和 Protobuf 來序列化其命令,而資料則使用二進位 Arrow IPC 協定進行序列化。
Arrow 與 Flatbuffers 有什麼關係?
Flatbuffers 是二進位資料序列化的底層建構區塊。它不適用於表示大型、結構化、同質的資料,並且不位於資料分析任務的正確抽象層。
Arrow 是一個資料層,直接針對資料分析的需求,提供分析所需的全面資料類型集合、對「空」值(表示遺失資料)的內建支援,以及不斷擴展的 I/O 和運算設施工具箱。
Arrow 檔案格式確實使用底層的 Flatbuffers 來序列化實作 Arrow 二進位 IPC 協定所需的架構和其他元資料,但 Arrow 資料格式使用其自己的表示形式來實現最佳存取和計算。