全部產品
Search
文件中心

Object Storage Service:通過EMR運行基於OSS-HDFS服務的TPC-DS Benchmark

更新時間:Jun 19, 2024

TPC-DS作為巨量資料行業中最權威且被廣泛認可的基準測試標準,用于衡量大規模資料處理系統的效能與效率的關鍵計量。阿里雲EMR是第一個通過認證的可運行TPC-DS 100 TB的巨量資料系統。本文介紹如何在EMR叢集環境下,充分利用OSS-HDFS服務的優勢,成功執行TPC-DS Benchmark的99個SQL查詢,並通過一系列最佳化策略實現更優的效能體驗。

使用情境

  • 巨量資料效能評估

    當您希望評估使用OSS-HDFS服務作為Hadoop資料存放區時的巨量資料處理效能,特別是對於大規模資料分析和查詢最佳化工作負載,TPC-DS可以作為標準的決策支援系統基準測試載入器。

  • 資料湖結構描述驗證

    如果您正在構建或已經擁有基於阿里雲OSS的資料湖架構,並且想驗證其在複雜查詢處理、ETL作業、資料倉儲效能等方面的效率,可以通過在EMR叢集上運行TPC-DS來獲得客觀、標準化的結果。

  • 瞭解效能表現

    當您進行叢集擴容、硬體升級或者調整儲存策略時,利用TPC-DS Benchmark可以協助您瞭解隨著資料量的增長和計算資源的變化,系統的整體效能表現。

  • 成本效益分析

    OSS作為Object Storage Service服務,相比傳統HDFS在成本結構上有一定優勢。通過實測OSS-HDFS在TPC-DS下的效能,可以結合成本因素來確定是否適用於特定業務情境,從而作出更具經濟效益的選擇。

背景資訊

TPC-DS作為全球權威的資料管理系統評測標準之一,由TPC組織設計和維護,但其官方提供的工具集主要服務於單機資料產生與SQL查詢執行,並不適合直接應用於大規模分布式環境下的效能評估。為適用於巨量資料分析情境,您需要準備以下工具和EMR叢集:

  • Hive TPC-DS Benchmark測試載入器

    該工具由Hortonworks開發,專為Hadoop生態系統中的Hive及Spark等組件定製,能夠有效類比巨量資料查詢挑戰,並支援在叢集環境下產生和執行TPC-DS以及TPC-H標準中的複雜SQL查詢。

  • 5.15.1及以上版本EMR叢集

    要求使用EMR-5.15.1及以上版本的EMR叢集,該版本叢集相容並支援Hortonworks Data Platform (HDP) 3系列,對應的Hive版本是3.1。

步驟1:建立EMR叢集和下載TPC-DS Benchmark工具

  1. 建立EMR-5.15.1及以上版本的叢集。

    Dingtalk_20240125172541.jpg

    建立EMR叢集時,請關注以下配置資訊,其他配置項的說明,請參見建立叢集

    模組

    配置項

    說明

    軟體佈建

    業務情境

    選擇新版資料湖

    中繼資料

    選擇DLF統一中繼資料

    叢集儲存根路徑

    選擇已開啟OSS-HDFS服務的Bucket。

    硬體設定

    節點群組

    emr-master節點開啟掛載公網。

    如果想獲得最佳效能,emr-core節點執行個體規格推薦使用巨量資料型或本地SSD。如果希望用小規模資料快速完成所有流程,emr-core節點執行個體規格也可以選擇通用型4 vCPU 16 GiB。

    重要

    根據您選擇啟動並執行資料集確定叢集規模,確保Core執行個體的資料盤總容量大於資料集規模的三倍。資料集相關資訊,請參見步驟3:產生並載入資料

  2. 通過SSH方式串連EMR叢集的emr-master節點。具體操作,請參見登入叢集

  3. 安裝Git和Maven。

    1. 執行以下命令,安裝Git。

      sudo yum install -y git
    2. Apache Maven Project下載最新的Binary tar.gz archive,例如apache-maven-3.9.6-bin.tar.gz。

    3. 將下載的檔案上傳到EMR叢集的Master節點,並解壓。

      tar zxf apache-maven-3.9.6-bin.tar.gz
    4. 配置環境變數。

      1. 切換至apache-maven-3.9.6目錄。

        cd apache-maven-3.9.6
      2. 配置環境變數。

        export MAVEN_HOME=`pwd`
        export PATH=`pwd`/bin:$PATH
  4. 下載TPC-DS Benchmark工具。

    1. 下載工具。

      • 通過Git下載

        在中國內地訪問GitHub較慢,如果下載失敗,可直接通過本地下載。

        git clone https://github.com/hortonworks/hive-testbench.git
      • 通過本地下載hive-testbench-hdp3.zip檔案。

    2. 上傳ZIP檔案到EMR叢集的emr-master節點。

    3. 在EMR叢集的emr-master節點,執行以下命令解壓縮ZIP檔案。

      unzip hive-testbench-hdp3.zip

步驟2:編譯並打包資料產生器

  1. (可選)配置阿里雲鏡像。

    如果在中國內地可以使用阿里雲鏡像加速Maven編譯。使用阿里雲鏡像,編譯並打包資料產生器的耗時為2min~3min。

    1. 執行如下命令,建立檔案目錄。

      mkdir -p ~/.m2/
    2. 執行如下命令,將Maven設定檔拷貝到新檔案目錄下。

      cp $MAVEN_HOME/conf/settings.xml ~/.m2/
    3. 在~/.m2/settings.xml檔案中添加鏡像資訊,具體內容如下:

      <mirror>
          <id>aliyun</id>
          <mirrorOf>central</mirrorOf>
          <name>Nexus aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
      </mirror>
  2. 切換到hive-testbench-hdp3目錄。

    cd hive-testbench-hdp3
  3. 下載tpcds-extern.patch檔案,上傳到目前的目錄下,然後通過以下命令複製到tpcds-gen/patches/all/目錄中。

    cp tpcds-extern.patch ./tpcds-gen/patches/all/
  4. 使用TPC-DS工具集進行編譯並打包資料產生器。

    ./tpcds-build.sh

步驟3:產生並載入資料

  1. 設定資料規模SF(Scale Factor)。

    SF單位相當於GB,所以SF=1相當於1 GB,SF=100相當於100 GB,SF=1000相當於1 TB,以此類推。本步驟樣本採用小規模資料集,推薦使用SF=3。具體命令如下:

    SF=3
    重要

    請確保資料盤總大小是資料集規模的3倍以上,否則後續流程中會出現報錯情況。

  2. 檢查並清理Hive資料庫。

    1. 檢查Hive資料庫是否存在。

      hive -e "desc database tpcds_bin_partitioned_orc_$SF"
    2. (可選)清理已經存在的Hive資料庫。

      重要

      如果Hive資料庫tpcds_bin_partitioned_orc_$SF已經存在,需要執行下面的命令清理資料庫,否則後續流程會報錯。如果不存在,則跳過該步驟。

      hive -e "drop database tpcds_bin_partitioned_orc_$SF cascade"
  3. 配置Hive服務地址。

    tpcds-setup.sh指令碼預設配置的Hive服務地址與EMR叢集環境不一致,所以需要將指令碼中HiveSever的地址替換為EMR叢集中的Hive服務地址。具體命令如下:

    sed -i 's/localhost:2181\/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=default/master-1-1:10000\//' tpcds-setup.sh

    指令碼預設配置的Hive服務地址為:jdbc:hive2://localhost:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=default。通過上述命令替換後的Hive服務地址為:jdbc:hive2://master-1-1:10000/

  4. 修複開源工具配置問題。

    部分參數在Hive 2和Hive 3等開源版本中不支援,繼續使用TPC-DS會導致作業報錯,所以需要參考以下命令替換參數。

    sed -i 's/hive.optimize.sort.dynamic.partition.threshold=0/hive.optimize.sort.dynamic.partition=true/' settings/*.sql
  5. 產生並載入資料。

    在SF=3時,該步驟耗時約40min~50min。如果運行正常,TPC-DS資料表將會載入到tpcds_bin_partitioned_orc_$SF資料庫中。產生的資料會自動儲存到建立EMR叢集時指定的儲存根路徑(即已開通OSS-HDFS服務的Bucket根目錄)。執行如下命令載入資料:

    ./tpcds-setup.sh $SF
  6. 擷取Hive表統計資訊。

    推薦使用Hive SQL ANALYZE命令擷取Hive表統計資訊,可以加快後續SQL的查詢速度。此步驟在SF=3時,耗時為20min~30min。

    hive -f ./hive-testbench-hdp3/ddl-tpcds/bin_partitioned/analyze.sql \
        --hiveconf hive.execution.engine=tez \
        --database tpcds_bin_partitioned_orc_$SF

步驟4:運行TPC-DS SQL

本步驟分別介紹如何使用Hive和Spark運行TPC-DS SQL。

使用Hive運行TPC-DS SQL

  1. 通過以下命令執行單SQL。

    TPC-DS SQL共有99個檔案都放在sample-queries-tpcds工作目錄下(包括query10.sqlquery11.sql等檔案)。在SF=3時,所有的SQL都可以在5min內返回結果。

    重要

    因為TPC-DS Query和資料都是隨機產生,所以部分SQL查詢返回結果數為0屬於正常現象。

    cd sample-queries-tpcds
    hive --database tpcds_bin_partitioned_orc_$SF
    set hive.execution.engine=tez;
    source query10.sql;
  2. 利用工具包中的指令碼順序執行99個完整SQL。具體命令如下:

    cd ~/hive-testbench-hdp3
    # 產生一個Hive設定檔,並指定Hive執行引擎為Tez。
    echo 'set hive.execution.engine=tez;' > sample-queries-tpcds/testbench.settings
    ./runSuite.pl tpcds $SF

批量執行SQL

使用Spark運行TPC-DS SQL

TPC-DS工具集中包含Spark SQL用例,用例位於spark-queries-tpcds目錄下,可以使用spark-sql或者spark-beeline等命令列工具執行這些SQL。本步驟以Spark Beeline工具串連Spark ThriftServer為例,介紹如何使用Spark運行TPC-DS SQL來查詢步驟3產生的TPC-DS資料集。

說明

EMR Spark支援HDFS和OSS等多種儲存介質儲存的資料表,也支援資料湖構建(DLF)中繼資料。

  1. 使用Spark Beeline ANALYZE命令獲得Hive表統計資訊,加快後續SQL查詢速度。

    cd ~/hive-testbench-hdp3
    spark-beeline -u jdbc:hive2://master-1-1:10001/tpcds_bin_partitioned_orc_$SF \
      -f ./ddl-tpcds/bin_partitioned/analyze.sql
  2. 切換到Spark SQL用例所在的檔案目錄。

    cd spark-queries-tpcds/
  3. 通過以下命令執行單個SQL。

    spark-beeline -u jdbc:hive2://master-1-1:10001/tpcds_bin_partitioned_orc_$SF -f q1.sql
  4. 通過指令碼順序執行99個SQL。

    TPC-DS工具集中沒有包含批量執行Spark SQL的指令碼,以下提供一個簡單指令碼供參考。

    for q in `ls *.sql`; do
      spark-beeline -u jdbc:hive2://master-1-1:10001/tpcds_bin_partitioned_orc_$SF -f $q > $q.out
    done
    重要

    SQL列表中q30.sql檔案存在列名c_last_review_date_sk錯寫為c_last_review_date的情況,所以該SQL運行失敗屬於正常現象。

常見問題

通過指令碼順序執行99個Spark SQL報錯,怎麼解決?

Spark ThriftServer服務的預設記憶體不適合較大規模資料集測試,如果在測試過程中出現Spark SQL作業提交失敗,原因可能是Spark ThriftServer出現OutOfMemory異常。針對這種情況的解決方案為調整Spark服務配置spark_thrift_daemon_memory的值後重啟ThriftServer服務。具體操作步驟如下:

  1. 進入Spark服務頁面。

    1. 登入E-MapReduce控制台

    2. 在頂部功能表列處,根據實際情況選擇地區和資源群組

    3. 單擊目的地組群操作列的叢集服務

    4. 叢集服務頁簽,單擊Spark3服務地區的配置

  2. 調整服務配置spark_thrift_daemon_memory的值。

    1. 搜尋參數spark_thrift_daemon_memory

    2. 根據使用的資料集規模調整對應的參數值。

      您可以將預設的值調大。

    3. 單擊儲存

    4. 在彈出的對話方塊中,輸入執行原因,單擊儲存

  3. 重啟Spark。

    1. 在Spark服務頁面,選擇右上方的更多操作 > 重啟

    2. 在彈出的對話方塊中,輸入執行原因,單擊確定

    3. 確認對話方塊中,單擊確定