天天看點

Spark 使用 parquet 列式存儲格式優化速度

1)如果說 HDFS 是大資料時代分布式檔案系統首選标準,那麼 parquet 則是整個大資料時代檔案存儲格式實時首選标準。

2)速度更快:從使用 spark sql 操作普通檔案 CSV 和 parquet 檔案速度對比上看,絕大多數情況會比使用 csv 等普通檔案速度提升10倍左右,在一些普通檔案系統無法在 spark上成功運作的情況下,使用 parquet 很多時候可以成功運作。

3)parquet 的壓縮技術非常穩定出色,在 spark sql 中對壓縮技術的處理可能無法正常的完成工作(例如會導緻 lost task,lost executor)但是此時如果使用 parquet 就可以正常的完成。

4)極大的減少磁盤 I/O,通常情況下能夠減少75%的存儲空間,由此可以極大的減少 spark sql 處理資料的時候的資料輸入内容,尤其是在 spark1.6x 之後版本的下推過濾器在一些情況下可以極大的減少磁盤的 I/O 和記憶體的占用(下推過濾器)。

5)從 spark 1.6x 開始的 parquet 方式極大的提升了掃描的吞吐量,極大提高了資料的查找速度 spark1.6 和 spark1.5x 相比而言,提升了大約1倍的速度,在 spark1.6X 中,操作 parquet 的時候 cpu 也進行了極大的優化,有效的降低了cpu 消耗。

6)采用 parquet 可以極大的優化 spark 的排程和執行。我們測試 spark 如果用 parquet 可以有效的減少 stage 的執行消耗,同時可以優化執行路徑。

Parquet檔案格式

Parquet檔案是以二進制方式存儲的,是以是不可以直接讀取的,檔案中包括該檔案的資料和中繼資料,是以Parquet格式檔案是自解析的。在HDFS檔案系統和Parquet檔案中存在如下幾個概念。

  • HDFS塊(Block):它是HDFS上的最小的副本機關,HDFS會把一個Block存儲在本地的一個檔案并且維護分散在不同的機器上的多個副本,通常情況下一個Block的大小為256M、512M等。
  • HDFS檔案(File):一個HDFS的檔案,包括資料和中繼資料,資料分散存儲在多個Block中。
  • 行組(Row Group):按照行将資料實體上劃分為多個單元,每一個行組包含一定的行數,在一個HDFS檔案中至少存儲一個行組,Parquet讀寫的時候會将整個行組緩存在記憶體中,是以如果每一個行組的大小是由記憶體大的小決定的,例如記錄占用空間比較小的Schema可以在每一個行組中存儲更多的行。
  • 列塊(Column Chunk):在一個行組中每一列儲存在一個列塊中,行組中的所有列連續的存儲在這個行組檔案中。一個列塊中的值都是相同類型的,不同的列塊可能使用不同的算法進行壓縮。
  • 頁(Page):每一個列塊劃分為多個頁,一個頁是最小的編碼的機關,在同一個列塊的不同頁可能使用不同的編碼方式。

檔案格式

通常情況下,在存儲Parquet資料的時候會按照Block大小設定行組的大小,由于一般情況下每一個Mapper任務處理資料的最小機關是一個Block,這樣可以把每一個行組由一個Mapper任務處理,增大任務執行并行度。Parquet檔案的格式如下圖所示

Spark 使用 parquet 列式存儲格式優化速度

繼續閱讀