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檔案尾部儲存了檔案的元資料資訊和統計資訊,自描述的,方便解析。