[原創]kudu vs parquet, impala vs spark Benchmark


測試環境

 

  • 節點:

               2 台主節點,6台計算節點

  • 機器配置:

               16個物理核

               128G內存

               12*3T磁盤

  • 操作系統:

               redhat 7.2

  • 版本:

               CDH 5.7.1-1.cdh5.7.1.p0.11

               impala_kudu 2.7.0-1.cdh5.9.0.p0.23

               kudu 0.9.1-1.kudu0.9.1.p0.32

               spark 2.0.0

  • 對照組:

               Spark on Parquet

               Impala on Parquet

               Impala on Kudu

測試數據、語句、場景

    TPC-DS,是用於評測決策支持系統(或數據倉庫)的標准SQL測試集。這個測試集包含對大數據集的統計/報表生成/聯機查詢/數據挖掘等復雜應用,測試用的數據和值是有傾斜的,與真實數據一致。可以說TPC-DS是與真實場景非常接近的一個測試集,也是難度較大的一個測試集。

    TPC-DS支持指定不同的數據大小。本次測試選擇的數據大小分別為10GB、100GB、1TB、10TB。數據大小與表rows的關系如下圖所示:

 

 

 

    TPC-DS一共99個測試案例,遵循SQL'99和SQL 2003的語法標准,SQL案例比較復雜.分析的數據量大,並且測試案例是在回答真實的商業問題.測試案例中包含各種業務模型(如分析報告型,迭代式的聯機分析型,數據挖掘型等).本次測試使用了大部分的query,某些query由於語法錯誤、語法不兼容,或者在Hive、Spark、Impala下面都無法跑過,因此這些query不納入性能測試的范圍。

參數配置

    本次測驗基本上使用了CDH的默認配置。一些重要配置有:

  • Hadoop:  使用非安全模式,不帶kerberos認證。
  • Impala:  使用自帶的Resource Management,而非YARN;Catalog Server設置內存為32gb;impalad內存設置為64gb。
  • Kudu:   使用data disks的第一塊磁盤作為WAL磁盤(也就是使用SATA盤);Kudu Tablet Server內存設置為32gb。
  • Spark:  配置如下
spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.driver.memory              10g
spark.executor.memory           10g
spark.executor.instances        36
spark.executor.cores            5
spark.yarn.executor.memoryOverhead  2g 
spark.sql.autoBroadcastJoinThreshold    209715200

  

測試步驟

 

  1. 通過tpcds-gen在hdfs上生成parquet數據
  2. 利用impala將tpcds數據從hdfs上導入到kudu
  3. 測試impala on kudu的性能
  4. 測試impala on parquet性能
  5. 測試spark on parquet的性能

測試結果

Kudu數據導入速度

    如圖所示,kudu在導入小表時速度非常快,當導入大表時,速度反而變慢,性能嚴重下降。為了避免表字段類型、字段數目、大小造成的速度差異。我們根據同一張表store_sales進行比較,其結果為

 

 

                                            (單位rows/秒, 越大越好)

    由於kudu一開始先將數據插入到memRowSet,因此在數據集較小時插入速度非常快。當插入的數據達到10億條級別以上時,性能開始出現嚴重的downgrade。根據Todd在slack上的解釋是,impala插入數據時采用了隨機的順序,如果先將數據排序,再用impala導入可改善插入性能。目前社區正在改善此問題。

Kudu 查詢性能

    首先我們比較一下100GB下impala on kudu 和impala on parquet的性能

                                           (單位second, 越小越好)

    如圖所示,在小數據集的查詢性能上,kudu普遍比parquet慢了2倍~10倍。

 

    如果我們再比較一下1TB下的性能,可以發現

 

    Kudu比parquet慢了10倍~100倍。這其中很可能是由於impala對kudu缺少優化導致的。因此我們再來比較基本查詢kudu的性能

 

 

    如圖所示,單從簡單查詢來看,kudu的性能和imapla差距不是特別大,其中出現的波動是由於緩存導致的。和impala的差異主要來自於impala的優化。

Spark 2.0 / Impala查詢性能

查詢速度

 

 

                                            (單位second, 越小越好)

    從數據大小分析, 1TB和10TB下的差異不大。

    從語句進行分析,Impala對於query75、query94下的性能較差,很可能是語句優化,join順序導致的異常。Spark對於query17、query50性能較差。

    綜合分析,可以發現impala的速度普遍比Spark快一倍以上。Impala經過compute stats之后,消除了query75、query94這兩個語句的異常,在其它語句上的速度提升達到了一倍以上,在某些語句上compute stats后速度反而下降,如query58,然而這種情況很少見。

資源使用情況

 

 

    Impala的資源使用整體少於Spark,磁盤的數據讀取少於Spark,這對於速度的提高至關重要,這與其語句的優化有關。Impala的CPU一直維持在較低的水平,說明其C++的實現比JAVA高效。

    Spark的CPU占用較高,但是維持在50%的水平,可見CPU並沒有成為其瓶頸。Spark的磁盤寫入(綠色)非常多,這也許是其速度的主要瓶頸。從網絡IO上來看Spark也多余Impala,這一點可能與語句的優化、join、shuffle的實現方式有關。

 

--------

By 浴雨青山

商業轉載請聯系作者獲得授權,非商業轉載請注明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM