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叢集:
該工具由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工具
建立EMR-5.15.1及以上版本的叢集。

建立EMR叢集時,請關注以下配置資訊,其他配置項的說明,請參見建立叢集。
模組
配置項
說明
軟體佈建
業務情境
選擇新版資料湖。
中繼資料
選擇DLF統一中繼資料。
叢集儲存根路徑
選擇已開啟OSS-HDFS服務的Bucket。
硬體設定
節點群組
emr-master節點開啟掛載公網。
如果想獲得最佳效能,emr-core節點執行個體規格推薦使用巨量資料型或本地SSD。如果希望用小規模資料快速完成所有流程,emr-core節點執行個體規格也可以選擇通用型4 vCPU 16 GiB。
重要根據您選擇啟動並執行資料集確定叢集規模,確保Core執行個體的資料盤總容量大於資料集規模的三倍。資料集相關資訊,請參見步驟3:產生並載入資料。
通過SSH方式串連EMR叢集的emr-master節點。具體操作,請參見登入叢集。
安裝Git和Maven。
執行以下命令,安裝Git。
sudo yum install -y git在Apache Maven Project下載最新的Binary tar.gz archive,例如apache-maven-3.9.6-bin.tar.gz。
將下載的檔案上傳到EMR叢集的Master節點,並解壓。
tar zxf apache-maven-3.9.6-bin.tar.gz配置環境變數。
切換至apache-maven-3.9.6目錄。
cd apache-maven-3.9.6配置環境變數。
export MAVEN_HOME=`pwd` export PATH=`pwd`/bin:$PATH
下載TPC-DS Benchmark工具。
下載工具。
通過Git下載
在中國內地訪問GitHub較慢,如果下載失敗,可直接通過本地下載。
git clone https://github.com/hortonworks/hive-testbench.git通過本地下載hive-testbench-hdp3.zip檔案。
上傳ZIP檔案到EMR叢集的emr-master節點。
在EMR叢集的emr-master節點,執行以下命令解壓縮ZIP檔案。
unzip hive-testbench-hdp3.zip
步驟2:編譯並打包資料產生器
(可選)配置阿里雲鏡像。
如果在中國內地可以使用阿里雲鏡像加速Maven編譯。使用阿里雲鏡像,編譯並打包資料產生器的耗時為2min~3min。
執行如下命令,建立檔案目錄。
mkdir -p ~/.m2/執行如下命令,將Maven設定檔拷貝到新檔案目錄下。
cp $MAVEN_HOME/conf/settings.xml ~/.m2/在~/.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>
切換到hive-testbench-hdp3目錄。
cd hive-testbench-hdp3下載tpcds-extern.patch檔案,上傳到目前的目錄下,然後通過以下命令複製到
tpcds-gen/patches/all/目錄中。cp tpcds-extern.patch ./tpcds-gen/patches/all/使用TPC-DS工具集進行編譯並打包資料產生器。
./tpcds-build.sh
步驟3:產生並載入資料
設定資料規模SF(Scale Factor)。
SF單位相當於GB,所以SF=1相當於1 GB,SF=100相當於100 GB,SF=1000相當於1 TB,以此類推。本步驟樣本採用小規模資料集,推薦使用SF=3。具體命令如下:
SF=3重要請確保資料盤總大小是資料集規模的3倍以上,否則後續流程中會出現報錯情況。
檢查並清理Hive資料庫。
檢查Hive資料庫是否存在。
hive -e "desc database tpcds_bin_partitioned_orc_$SF"(可選)清理已經存在的Hive資料庫。
重要如果Hive資料庫tpcds_bin_partitioned_orc_$SF已經存在,需要執行下面的命令清理資料庫,否則後續流程會報錯。如果不存在,則跳過該步驟。
hive -e "drop database tpcds_bin_partitioned_orc_$SF cascade"
配置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/。修複開源工具配置問題。
部分參數在Hive 2和Hive 3等開源版本中不支援,繼續使用TPC-DS會導致作業報錯,所以需要參考以下命令替換參數。
sed -i 's/hive.optimize.sort.dynamic.partition.threshold=0/hive.optimize.sort.dynamic.partition=true/' settings/*.sql產生並載入資料。
在SF=3時,該步驟耗時約40min~50min。如果運行正常,TPC-DS資料表將會載入到tpcds_bin_partitioned_orc_$SF資料庫中。產生的資料會自動儲存到建立EMR叢集時指定的儲存根路徑(即已開通OSS-HDFS服務的Bucket根目錄)。執行如下命令載入資料:
./tpcds-setup.sh $SF擷取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
通過以下命令執行單SQL。
TPC-DS SQL共有99個檔案都放在sample-queries-tpcds工作目錄下(包括query10.sql和query11.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;利用工具包中的指令碼順序執行99個完整SQL。具體命令如下:
cd ~/hive-testbench-hdp3 # 產生一個Hive設定檔,並指定Hive執行引擎為Tez。 echo 'set hive.execution.engine=tez;' > sample-queries-tpcds/testbench.settings ./runSuite.pl tpcds $SF

使用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)中繼資料。
使用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切換到Spark SQL用例所在的檔案目錄。
cd spark-queries-tpcds/通過以下命令執行單個SQL。
spark-beeline -u jdbc:hive2://master-1-1:10001/tpcds_bin_partitioned_orc_$SF -f q1.sql通過指令碼順序執行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運行失敗屬於正常現象。