1. 程式人生 > >HDFS列式儲存Parquet與行式儲存(Avro)效能測試-Benchmark(hadoop, Spark, Scala)

HDFS列式儲存Parquet與行式儲存(Avro)效能測試-Benchmark(hadoop, Spark, Scala)

關於Parquet

Parquet是面向分析型業務的列式儲存格式,由Twitter和Cloudera合作開發,2015年5月從Apache的孵化器裡畢業成為Apache頂級專案,細節請參考http://parquet.apache.org/documentation/latest/

列式儲存

列式儲存和行式儲存相比有哪些優勢呢?

  • 可以跳過不符合條件的資料,只讀取需要的資料,降低IO資料量。
  • 壓縮編碼可以降低磁碟儲存空間。由於同一列的資料型別是一樣的,可以使用更高效的壓縮編碼(例如Run Length Encoding和Delta Encoding)進一步節約儲存空間。
  • 只讀取需要的列,支援向量運算,能夠獲取更好的掃描效能。

適配多種計算框架

Parquet是語言無關的,而且不與任何一種資料處理框架繫結在一起,適配多種語言和元件,能夠與Parquet配合的元件有:

查詢引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL

計算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite

資料模型: Avro, Thrift, Protocol Buffers, POJOs

效能

Parquet就是基於Google的Dremel系統的資料模型和演算法實現的。核心思想是使用“record shredding and assembly algorithm”來表示複雜的巢狀資料型別,同時輔以按列的高效壓縮和編碼技術,實現降低存

儲空間,提高IO效率,降低上層應用延遲。

Parquet列式儲存帶來的效能上的提高在業內已經得到了充分的認可,特別是當你們的表非常寬(column非常多)的時候,Parquet無論在資源利用率還是效能上都優勢明顯。具體的效能指標詳見參考文件。

Spark已經將Parquet設為預設的檔案儲存格式,Cloudera投入了很多工程師到Impala+Parquet相關開發中,Hive/Pig都原生支援Parquet。Parquet現在為Twitter至少節省了1/3的儲存空間,同時節省了大量的表

掃描和反序列化的時間。這兩方面直接反應就是節約成本和提高效能(詳見benchmark)。

benchmark

以郵箱的展示日誌為例,比較了Avro和Parquet兩種儲存格式的效能:廣告系統日誌,5,361,809條記錄,hadoop2.4,Spark1.3.1。如下:

-

encoded size(MB,Snappy)

Standlone單執行緒1列(ms)(read, fliter, count)

SparkSql 1列(ms)(read, fliter, count)

Spark 1列(ms)(read,fliter, count)

Spark 4列(read, count)

Avro

687

43,634

-

28,469(newAPIHadoopFile:39,226)

29,020

Parquet

660

3,355

6,981

3,530

9,359

備註:1. 測試程式碼詳見AvroParquetBenchMark 2. 讀取Avro是新老API效能差距較大,目前還未找到原因。

與Avro

之前新統計系統的日誌都是用Avro做序列化和儲存,鑑於Parquet的優勢和對Avro的相容,將HDFS上的儲存格式改為Paruqet,並且只需做很小的改動就用原讀取Avro的API讀取Parquet,單列查詢效率可

以提高近一個數量級。

Schema

Parquet檔案尾部儲存了檔案的元資料資訊和統計資訊,自描述的,方便解析。