在本文中,我們將通過Apache Spark,來向您介紹上述四種大數據文件格式的各種屬性,及其優缺點比較。

作者:陳峻編譯來源:51CTO.com

【線上直播】11月21日晚8點貝殼技術總監侯聖文《數據安全之數據庫安全黃金法則》

【51CTO.com快譯】衆所周知,Apache Spark支持許多種不同的數據格式,其中包括:無處不在的CSV格式、對於Web友好的JSON格式、以及常被用於大數據分析的Apache Parquet和Apache Avro。

解析四種大數據文件格式

在本文中,我們將通過Apache Spark,來向您介紹上述四種大數據文件格式的各種屬性,及其優缺點比較。

1、CSV

CSV(Comma-Separated Values,逗號分隔值)文件,通常被用於在使用純文本的系統之間,交換表格類型的數據。CSV是一種基於行的文件格式。也就是說,此類文件中的每一行都對應到數據表中的具體某一行。通常,CSV文件裏包含有一個標題行,該標題行提供了數據的列名。如果沒有標題行的話,該文件將被視爲已部分完成了結構化工作。

單個CSV文件往往無法顯示層次化的結構、或數據關係。而具體的數據連接關係往往需要通常多個CSV文件進行組織。各種外鍵(Foreign key)一般被存儲在一個或多個文件的多個列中。不過這些文件之間的鏈接並非由其格式本身來表示。此外,由於並未完全標準化,因此在CSV格式文件中,您可以使用逗號以外的界定符,例如:製表符(tabs)或空格。

CSV文件的另一個特性是:只有處於未壓縮的原始文件狀態、或是運用諸如bzip2(https://en.wikipedia.org/wiki/Bzip2)或lzo(https://ru.wikipedia.org/wiki/LZO)之類的解壓縮工具時,CSV文件才能夠被拆分(注意:lzo需要進行索引之後,方可執行拆分)。

優點:

  • CSV易於人工閱讀,也易於手動編輯。
  • CSV提供了一種簡單明瞭的信息模式(schema)。
  • 幾乎所有現有的應用程序都能夠處理CSV文件。
  • CSV文件比較易於實現和解析。
  • 對於XML而言,您需要在每一行的每一列中分別添加開始與結束標籤;而CSV比較簡約,您只需一次性寫入列標題即可。

缺點:

  • 由於處置的是平面數據,因此需要事先對複雜的數據結構進行格式上的轉換。
  • 由於不支持列的類型,因此在文本列和數字列之間並無區別。
  • 並無表示二進制數據的標準方法。
  • 由於NULL和引號之間並無區別,因此導入CSV時可能會出現問題。
  • 對於特殊字符的支持性較差。
  • 缺乏通用的標準。

儘管存在着一定的侷限性,但CSV文件仍然是數據共享領域的上乘之選。它經常被廣泛地用於各類業務應用、消費者行業、以及科學分析程序中。當前,大多數批處理和流數據處理模塊(如Spark和Hadoop),都能夠支持CSV文件的序列化與反序列化。它們在讀取時提供了添加schema的方法。

2、JSON格式

JSON數據(JavaScript object notation,對象表示法)是以部分結構化的格式,表示各種鍵值(key-value)對。與XML不同,JSON通常可以按照分層的格式存儲數據,即:子數據可以由父數據來顯示。而與XML相同的是,它們在格式上都具有自我描述性(self-describing),可以被用戶直接讀取。不過,JSON文檔通常要小得多。隨着基於REST的Web服務的大量出現,JSON文檔被頻繁地使用在網絡通信中。

由於許多類型的數據傳輸都已經用到了JSON格式,因此目前大多數的Web編程語言都能夠支持JSON,或者通過使用外部庫,來對JSON數據進行序列化和反序列化。正是有了這種支持,JSON能夠通過顯示數據結構,幫助用戶實現熱數據(hot data)的格式轉換、以及冷數據(cold data)存儲所涉及到的各種邏輯格式。

目前,許多批處理與流數據處理模塊,都能夠原生地支持JSON的序列化和反序列化。JSON文檔中包含的數據,不但最終能夠以性能更爲優化的格式(如Parquet或Avro)予以存儲,而且JSON所提供的原始數據類型,對於按需進行數據重新處理的任務也是非常重要的。

JSON文件具有如下優點:

  • JSON支持分層式結構,簡化了文檔中有關數據的存儲,以及複雜關係的表示問題。
  • 大多數編程語言都能夠提供簡化的JSON序列化庫,並且能夠對JSON序列化/反序列化提供內置的支持。
  • JSON支持對象列表,能夠有助於避免將對象列表錯誤地轉換爲關係型數據模型。
  • 諸如MongoDB、Couchbase和Azure Cosmos DB等NoSQL數據庫,都能夠支持JSON文件格式。
  • 目前大多數工具都內置了對於JSON的支持。

3、Parquet

Cloudera和Twitter於2013年開發出了Parquet。它可以被用作基於列的存儲格式,並針對多列數據集進行了適當地優化。由於其數據是按列進行存儲的,因此它可以對數據進行高度壓縮(其壓縮算法對於那些包含在列中的、信息熵值較低的數據,效果會更好),以及拆分操作。Parquet的開發者號稱:此類存儲格式非常適合於處理大數據的相關問題。

與CSV和JSON不同,Parquet是一種二進制文件,其中包含了各種針對其內容的元數據(metadata)。因此,在無需讀取與解析文件內容的情況下,Spark可以僅依靠元數據來確定文件中的列名稱、壓縮/編碼方式、數據類型、乃至一些基本的統計類信息。另外,由於Parquet文件的列相關元數據通常被存儲在文件的末尾,因此方便了用戶一次性快速地寫入信息。同時,Parquet針對WORM(Write Once Read Many,一次寫入多次讀取,請參見)的範例也進行了優化。雖然在寫入文件其速度較慢,但是用戶在讀取時,尤其是僅訪問某個列的子集時,速度卻快得驚人。可見,對於那些需要大量進行讀取操作的工作負載而言,Parquet是一種不錯的選擇。而對於需要操作整行數據的用例而言,用戶則應當使用CSV或AVRO之類的格式。

Parquet在數據存儲方面的優點包括:

  • 由於是一種柱狀結構的形式,因此Parquet只會讀取所需的列信息,進而減少了對於磁盤I/O的消耗。這個概念被稱爲投影下推(projection pushdown)。
  • 由於schema是隨着數據一起移動的,因此數據能夠自我描述(self-describing)。
  • 雖然主要是爲HDFS而創建的,但是其數據完全可以被存儲在GlusterFs或NFS之類的其他文件系統中。
  • 作爲一個文件,您可以輕鬆地對Parquet進行移動、備份、複製、以及使用。
  • 能夠對Spark提供開箱即用式的原生支持,能夠對於用戶存儲中的文件直接進行讀取與保存。
  • 當採用諸如snappy之類的壓縮格式時,Parquet可以達到75%的高壓縮比。
  • 在實際運用中,與同類其他文件格式相比,該格式讀取工作流的速度最快。
  • Parquet非常適合於那些需要對大量數據進行列彙總的數據倉庫類應用。
  • 可以通過Avro API和Avro Schema來讀取和寫入Parquet。
  • 通過提供謂詞下推(predicate pushdown),Parquet可以進一步降低磁盤I/O的成本。

謂詞下推/過濾下推

謂詞下推的基本思想是:將查詢的某些部分(如:謂詞)“推送”到數據的存儲位置。例如,當我們提供一些過濾條件時,數據存儲將會以過濾記錄的方式,再從磁盤中讀取數據。

謂詞下推的優點:由於不再需要將整個數據讀入內存並進行過濾,因此它並不需要大量的內存,也不會產生過多的磁盤I/O。顯然整體性能得到了顯著提升。

可見,此類方法可以通過較早地過濾掉無關數據的方式,來大幅減少查詢與處理的時間。根據處理框架的不同,謂詞下推可以通過執行不同的操作來優化查詢。例如:在通過網絡傳輸之前便過濾數據,在將數據加載到內存之前過濾數據,或是跳過讀取整個文件(文件塊)等操作。

目前,大多數RDBMS,包括Parquet和ORC等大數據存儲格式,都能夠遵循謂詞下推的相關概念。

投影下推

解析四種大數據文件格式

投影下推的基本思想是:在對存儲進行數據查詢與讀取時,並非讀取所有字段,而只是讀取那些必需的列。通常,Parquets和ORC之類的列格式都能夠通過遵循此概念,以產生更好的I/O性能。

4、Avro

由Hadoop工作組於2009年發佈的Apache Avro,是一種基於行的、可高度拆分的數據格式。Avro能夠支持多種編程語言。通常,它也被描述爲類似於Java序列化的數據序列化系統。爲了最大程度地減小文件大小、並提高效率,它將schema存儲爲JSON格式,而將數據存儲爲二進制格式。

Avro通過管理各種添加、丟失、以及已更改的字段,來爲schema的演化提供強大的支持。這使得舊的軟件可以讀取新的數據,而新的軟件也可以讀取那些舊的數據。而這對於那些經常發生變更的數據而言,是非常重要的。

Avro通過schema架構的管理能力,可以在不同的時段獨立地更新不同的組件,從而降低了不兼容性所帶來的風險。同時,開發人員既不必在應用程序中編寫if-else語句,來應對不同的架構版本,也不必通過查看舊的代碼,來理解那些舊的架構。而且,所有版本的schema都存儲在可讀的JSON標頭中,以方便開發人員理解所有可用的字段。

如前文所述,由於schema是以JSON格式存儲的,而數據是以二進制形式存儲的,因此Avro是持久性數據存儲和電傳(wire transfer)的簡約之選。另外,由於用戶能夠輕鬆地向Avro附加新的數據行,因此它通常是那些大量寫入工作負載的首選格式。

優點:

  • Avro是一種與語言無關的數據序列化。
  • Avro將schema存儲在文件的標題中,因此數據具有自描述性。
  • Avro格式的文件既可以被拆分、又可以被壓縮,因此非常適合於在Hadoop生態系統中進行數據的存儲。
  • 由於Avro文件將負責讀取的schema與負責寫入的schema區分開來,因此它可以獨立地添加新的字段。
  • 與序列文件(Sequence Files)相同,爲了實現高度可拆分性,Avro文件也包含了用於分隔不同塊(block)的同步標記。
  • 可以使用諸如snappy之類的壓縮格式,來壓縮不同的目標塊。

總結

下表是上述四種文件格式的綜合比較。

解析四種大數據文件格式

上表中的*號爲:當作爲CSV被壓縮時,JSON具有可拆分性方面的類似問題。也就是說:當“wholeFile”選項被設置爲true時(請參閱SPARK-18352),JSON是不可拆分的。

  • CSV有着最快的寫入速度;JSON方便了人工閱讀和理解;Parquet在讀取列的子集方面速度最快;而Avro在一次性讀取所有列方面速度最快。
  • JSON是Web通信方面的標準。通過定義良好的schema,各種API和網站可以持續使用JSON進行通信。
  • 針對大數據的需求,Parquet和Avro進行了可拆分性方面的優化,可支持各種壓縮,以及複雜數據結構。不過,它們的可讀性和寫入速度非常差。

原文標題:Big Data File Formats Explained,作者:luminousmen

相關文章