天天看點

Parquet性能測試調優及其優化建議

                  Parquet性能測試調優及其優化建議

  一、我們為什麼選擇parquet

  1、選擇parquet的外部因素

  (1) 我們已經在使用spark叢集,spark原本就支援parquet,并推薦其存儲格式(預設存儲為parquet);

(2) hive支援parquet格式存儲,使用HiveSql查詢也是完全相容的。

2、選擇parquet的本身原因

  (1) parquet由于每一列的成員都是同構的,可以針對不同的資料類型使用更高效的資料壓縮算法,進一步減小I/O。CSV格式一般不進行壓縮,通過parquet存儲資料有效的節約了空間,不考慮備份情況下,壓縮比将近27倍(parquet有四種壓縮方式lzo、gzip、snappy、uncompressed,其中預設gzip的壓縮方式,其壓縮率最高,壓縮解壓的速率最快);

  (2) 查詢的時候不需要掃描全部的資料,而隻需要讀取每次查詢涉及的列,這樣可以将I/O消耗降低N倍,另外可以儲存每一列的統計資訊(min、max、sum等);

  (3) 分區過濾與列修剪中,parquet結合spark可以實作分區過濾(spark sql,rdd的filter和where關鍵字),列修剪即擷取所需要的列,列數越少查詢的速率也就也快;

  1. 由于每一列的成員的同構性,可以使用更加适合CPU pipeline的編碼方式,減小CPU的緩存失效。
  2. parquet的列式存儲格式的解析(僅了解)
    Parquet性能測試調優及其優化建議
    Parquet檔案在磁盤上的分布情況如上圖,所有的資料被水準切分成Row group,一個Row group包含這個Row group對應的區間内的所有列的column chunk 。一個column chunk負責存儲某一列的資料,這些資料是這一列的Repetition level,Definition level和Values。一個column chunk是由Page組成的,Page是壓縮和編碼的單元,對資料模型來說是透明的。一個Parquet檔案最後是Footer,存儲了檔案的中繼資料資訊和統計資訊。Row group是資料讀寫時候的緩存單元,是以推薦設定較大的Row group進而帶來較大的并行度,當然也需要較大的記憶體空間作為代價。一般情況下推薦配置一個Row group大小1G,一個HDFS塊大小1G,一個HDFS檔案隻含有一個塊。
  3. Parquet性能測試

    (1)測試普通檔案和parquet檔案讀取列的性能

    ①測試環境:58.56機器、spark1.6、sts、hive等

    ②測試目的:驗證spark在讀取普通檔案和parquet檔案性能時,在讀取相同的列的速率上面,比普通的檔案效率更高,随着列的增加讀取的效率會降低。

    ③測試原理:

    由于以下特性,使得列式存儲對于一些運算速率相對行式存儲運作速率更快:

    (1)由于每一列的成員都是同構的,可以針對不同的資料類型使用更高效的資料壓縮算法,進一步減小I/O。

    (2)由于每一列的成員的同構性,可以使用更加适合CPU pipeline的編碼方式,減小CPU的緩存失效。

    ④測試步驟

    (1)使用C_PORT表建立hive表,同樣建立一個C_PORT_PARQUET,使用stored as parquet将表存儲為parquet格式;

    (2)編寫spark讀取語句,對列數進行查詢讀取操作;

    (3)增加讀取列數,在機器上spark送出任務運作記錄運作時間;

    (4)對比運作時間,得出最終結論。

    ⑤測試結果

    約27005w資料   普通hive表      request表    測試結果:

查詢列數 普通hive表耗時 Parquet表耗時
1列  2分53秒 2分42秒
5列  3分53秒 1分27秒
20列  5分58秒 3分56秒  
35列  9分16秒 9分36秒  
50列 13分19秒 8分11秒

⑥總結結論

  通過以上五組資料列的讀取得知,随着列數的增加,讀取的時間增加,相對于parquet和普通hive的讀取速率相近,由此在列數較多時,讀取非全部列資料,建議使用parquet存儲可以增加讀取效率。

(2)測試parquet列式存儲在對多列資料進行列式計算的效率

②測試目的:驗證spark在讀取普通檔案和parquet檔案性能時,針對某些列式運算列式存儲的性能更佳,即讀取計算速率更快。

(1)查詢的時候不需要掃描全部的資料,而隻需要讀取每次查詢涉及的列,這樣可以将I/O消耗降低N倍,另外可以儲存每一列的統計資訊(min、max、sum等),實作部分的謂詞下推。

(2)由于每一列的成員都是同構的,可以針對不同的資料類型使用更高效的資料壓縮算法,進一步減小I/O。

(3)由于每一列的成員的同構性,可以使用更加适合CPU pipeline的編碼方式,減小CPU的緩存失效。

(2)編寫spark讀取語句,包含列式計算的sum,avg以及max,min語句;

(3)在機器上spark送出任務運作記錄運作時間;

第一組:

約27005w資料   普通hive表      request表    (按照每天小時分組,2個求和,3個求平均運算)  

測試結果:

時間 普通hive表 Parquet表
耗時   2分14秒   1分37秒
  2分24秒   1分08秒
  2分27秒   1分36秒
平均耗時 2分33秒

第二組:

約27005w資料   普通hive表      request表    (按照每天小時分組,2個求和,3個求平均運算,2求最大值,2個求最小值)

  2分22秒   1分38秒
  2分58秒     1分51秒
  2分31秒  
2分37秒 1分42秒

第三組:

約27005w資料   普通hive表      request表    (按照每天小時分組,4個求和,4個求平均運算,4求最大值,4個求最小值)  

  3分03秒   1分58秒
  2分45秒     2分03秒
  2分48秒     2分06秒
2分52秒 2分02秒  

通過三組數值的比對計算,列式存儲格式parquet針對列式計算效率比普通的行式存儲有明顯的優勢,運算的效率提升在30%-40%左右,效率更高,執行效率更快。

  1. 測試普通檔案和parquet檔案的壓縮效率對比

    ②測試目的:驗證測試普通檔案和parquet檔案的壓縮效率對比,在壓縮存儲相同資料時,存儲為parquet檔案壓縮效率更高,占用的空間更小。

    (1)同樣的SparkSql運作,存儲方式不同。生成相同資料量的parquet檔案和普通檔案存儲;

    (2)分别檢視生成的Parquet檔案和普通檔案的大小,對比結果。

    結果如下圖:

    Parquet性能測試調優及其優化建議

      經過最終執行結果,存儲為普通檔案的總大小為12.6G,存儲為parquet檔案的大小為3.6G,存儲所占空間減少了近70%,是以存儲為parquet檔案占用的空間更小。

    四、Parquet在實際項目中的應用建議

    (1)當讀取的列數并非全部列數,建議使用parquet格式存儲(建表時使用stored by parquet);

    (2)在進行列式計算或者向量計算時,建議也使用parquet格式存儲,可以提高運算效率;

    (3)如果有檔案需要備份存儲,可以使用parquet檔案進行壓縮,可以有效的節約空間,提高壓縮效率和速率。

上一篇: stm32 PWM
下一篇: STM32學習