大資料檔案格式比較:AVRO vs. PARQUET vs. ORC
為什麼我們需要不同的檔案格式?對於 MapReduce 和 Spark 等支援 HDFS 的應用程式而言,一個巨大的瓶頸是在特定位置查詢相關資料所需的時間以及將資料寫回另一個位置所需的時間。這些問題隨著管理大型資料集的困難而變得複雜,例如不斷髮展的模式或儲存限制。
當我們在處理大資料時,儲存此類資料所需的成本更高(Hadoop冗餘儲存資料以實現容錯)。除了儲存成本,處理資料還伴隨著CPU、網路、IO等成本,隨著資料的增加,處理和儲存的成本也隨之增加。
各種 Hadoop 檔案格式已經演變為在許多用例中緩解這些問題的一種方式。
選擇合適的檔案格式可以帶來一些顯著的好處:
- 更快的讀取時間
- 更快的寫入時間
- 可拆分檔案
- 模式演變支援
- 高階壓縮支援
一些檔案格式是為一般用途而設計的,另一些是為更具體的用例而設計的,還有一些是為特定資料特徵而設計的。所以真的有很多選擇。
Avro
Avro 是一種基於行的 Hadoop 儲存格式,被廣泛用作序列化平臺。
Avro 以 JSON 格式儲存模式,使其易於被任何程式讀取和解釋。
資料本身以二進位制格式儲存,使其緊湊且高效。
Avro 是一個語言中立的資料序列化系統。它可以被多種語言處理(目前是 C、C++、C#、Java、Python 和 Ruby)。
Avro 的一個關鍵特性是對隨時間變化的資料結構的強大支援,即結構演變。Avro 處理結構更改,例如缺少欄位、新增的欄位和更改的欄位。
Avro 提供了豐富的資料結構。例如,您可以建立包含陣列、列舉型別和子記錄的記錄。
這種格式是在資料湖儲存資料的理想選擇,因為:
- 1. 資料湖的資料通常作為一個整體被讀取,以供下游系統進一步處理(在
- 這種情況下,基於行的格式更有效) .
- 2. 下游系統可以輕鬆地從檔案中檢索表模式(無需將資料結構單獨儲存在外部元儲存中)。
- 3. 任何源模式更改都很容易處理(結構演變)。
PARQUET檔案格式
Parquet 是一種用於 Hadoop 的開原始檔格式,以平面柱狀格式儲存巢狀資料結構。
與以行方式儲存資料的傳統方法相比,parquet 在儲存和效能方面更高效。
這對於從“寬”(具有許多列)表中讀取特定列的查詢特別有用,因為只讀取需要的列並且最小化 IO。
為了更好地理解 Hadoop 中的 Parquet 檔案格式,首先我們來看看什麼是列格式。在面向列的格式中,記錄中相同型別的每一列的值儲存在一起。
Parquet的獨特功能之一是它也可以以柱狀方式儲存具有巢狀結構的資料。這意味著在 Parquet 檔案格式中,即使是巢狀欄位也可以單獨讀取,而無需讀取巢狀結構中的所有欄位。Parquet 格式使用記錄分解和組裝演算法以柱狀方式儲存巢狀結構。
要了解 Hadoop 中的 Parquet 檔案格式,您應該瞭解以下術語 -
- 行組:將資料邏輯水平劃分為行。行組由資料集中每一列的列塊組成。
- 列塊:特定列的資料塊。這些列塊存在於特定的行組中,並保證在檔案中是連續的。
- 頁面:列塊被分成背靠背寫的頁面。這些頁面共享一個共同的標題,讀者可以跳過他們不感興趣的頁面。
此處,Header 僅包含一個幻數“PAR1”(4 位元組),將檔案標識為 Parquet 格式檔案。
頁尾包含以下內容 -
- 檔案後設資料- 檔案後設資料包含所有列後設資料起始位置的位置。讀者應該首先讀取檔案後設資料以找到他們感興趣的所有列塊。然後應該順序讀取列塊。它還包括格式版本、架構和任何額外的鍵值對。
- 檔案後設資料的長度(4 位元組)
- 幻數“PAR1”(4 位元組)
ORC檔案格式
提供了高效的方式來儲存資料。它旨在克服其他檔案格式的限制。它理想地儲存緊湊的資料,並允許跳過不相關的部分,而無需大型、複雜或手動維護的索引。ORC 檔案格式解決了所有這些問題。
ORC 檔案格式有很多優點,例如:
- 單個檔案作為每個任務的輸出,減少 NameNode 的負載
- Hive 型別支援,包括 DateTime、decimal 和複雜型別(結構、列表、對映和聯合)
- 使用單獨的 RecordReader 併發讀取同一檔案
- 無需掃描標記即可拆分檔案
- 根據檔案頁尾中的資訊,估計 Reader/Writer 的堆記憶體分配上限。
- 使用協議緩衝區儲存的後設資料,允許新增和刪除欄位
ORC 將行集合儲存在一個檔案中,並且在集合中,行資料以列格式儲存。
ORC 檔案包含稱為條帶的行資料組,以及檔案頁尾中的輔助資訊。在檔案的末尾附有壓縮引數和壓縮頁尾的大小。
預設條帶大小為250 MB。大條帶大小支援從 HDFS 進行大量、高效的讀取。
檔案頁尾包含檔案中的條帶列表、每個條帶的行數以及每列的資料型別。它還包含列級聚合計數、最小值、最大值和總和。
- Stripe footer包含流位置的目錄。
- 行資料用於表掃描。
- 索引資料包括每列的最小值和最大值以及行在每列中的位置。ORC 索引僅用於條帶和行組的選擇,而不用於回答查詢。
AVRO與PARQUET
- AVRO 是一種基於行的儲存格式,而 PARQUET 是一種基於列的儲存格式。
- PARQUET 對於分析查詢要好得多,即讀取和查詢比寫入更有效。
- AVRO 中的寫操作比 PARQUET 中的要好。
- 在模式演變方面,AVRO 比 PARQUET 成熟得多。PARQUET 僅支援模式追加,而 AVRO 支援功能強大的模式演變,即新增或修改列。
- PARQUET 非常適合查詢多列表中的列子集。AVRO 是我們需要查詢所有列的 ETL 操作的理想選擇。
ORC 與 PARQUET
- PARQUET 更能儲存巢狀資料。
- ORC 更有能力進行謂詞下推。
- ORC 支援 ACID 屬性。
- ORC 的壓縮效率更高。
相關文章
- Redis vs. MongoDB比較RedisMongoDB
- 搞懂:資料科學vs.機器學習vs.資料分析vs.商業分析資料科學機器學習
- Rust的Vector vs. Golang的Slice比較RustGolang
- Java 下的 JSON庫效能比較:JSON.simple vs. GSON vs. Jackson vs. JSONPJavaJSON
- J2EE vs. NET, Java vs. C#:比較公正的評價 (轉)JavaC#
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- MVC vs. MVP vs. MVVMMVCMVPMVVM
- GraphQL Vs. REST? API 開發方法的誠實比較 | transpositRESTAPI
- Flink生成Parquet格式檔案實戰
- git revert .vs. git reset .vs. git rebaseGit
- String.format VS. StrSubstitutor VS. NamedParameterJdbcTemplateORMJDBC
- 如何在MapReduce中使用Avro資料格式?VR
- Service Mesh框架對比:Linkerd vs. Istio框架
- 檔案(圖片)上傳調研: HTML 5 vs. FlashHTML
- 非同步日誌 vs. 記憶體對映檔案非同步記憶體
- HTMLCollection vs. NodeListHTML
- PostgreSQL vs. MySQLMySql
- AutoIt vs. QTPQT
- 【譯】GraphQL vs. RESTREST
- JavaScript運算子:== VS. ===JavaScript
- Accoona VS. GoogleGo
- Ansible vs. TerraformORM
- 用VBS比較兩個Excel檔案的資料Excel
- Git branching: master vs. origin/master vs. remotes/origin/masterGitASTREM
- 柏拉圖洞穴寓言 vs. 表徵假說 vs. 表觀遺傳
- 比較 Apache Hadoop 資料儲存格式 - techwellApacheHadoop
- SparkSQL讀取Parquet格式的資料載入DatFrameSparkSQL
- Spring WebClient vs. RestTemplateSpringWebclientREST
- 引用計數 vs. GCGC
- javascript requestAnimationFrame vs. setTimeoutJavaScriptrequestAnimationFrame
- HTML 5 Canvas vs. SVGHTMLCanvasSVG
- PostgreSQL vs. Oracle 測試SQLOracle
- WebForms VS. MVC(翻譯)WebORMMVC
- PostgreSQL vs. MS SQL ServerSQLServer
- Angular vs. React - the tie breakerAngularReact
- Hive Streaming 追加 ORC 檔案Hive
- JavaScript構建(編繹)系統大比拼:Grunt vs. Gulp vs. NPMJavaScriptNPM
- 檔案內容比較