劉建鵬 劉堯
摘要:TPC-DS是事務性能管理委員會(TPC)組織發(fā)布的一種數(shù)據(jù)庫評測基準,其中共包含99種查詢語句,涵蓋各種復雜的SQL應用,與真實數(shù)據(jù)一致。但是執(zhí)行時生成數(shù)據(jù)、生成查詢語句、執(zhí)行語句都需要手動操作,使用起來較為不方便。本文介紹一種將TPC-DS工具合入HiBench測試框架的方法。
關鍵詞:TPC-DS;HiBench;性能測試
中圖分類號:TP311 文獻標識碼:A 文章編號:1007-9416(2019)10-0064-02
HiBench是一個大數(shù)據(jù)性能測試套件,可以用來測試一個Hadoop集群對于各種常見任務的處理速度。可以對MapReduce、Spark、Flink、Hdfs等組件進行性能測試,支持的負載包括文件讀寫、圖處理、機器學習、數(shù)據(jù)庫操作等類型。但是HiBench提供的SQL類執(zhí)行語句較少,主要是Join、Aggregation操作。而TPC-DS工具包含了大量的SQL語句,但并沒有提供便捷的使用方法。因此我們結合兩種測試工具,將TPC-DS合入HiBench框架進行執(zhí)行。
1 HiBench框架介紹
以HiBench5.0版本為例,根目錄下有四個目錄,分別是src、bin、conf、workloads。src目錄存放待執(zhí)行負載的源代碼,編譯后生成jar包;conf目錄存放大部分的配置,如數(shù)據(jù)規(guī)模、大數(shù)據(jù)組件的路徑、集群節(jié)點數(shù)等;workloads目錄存放各個負載的執(zhí)行入口;bin目錄存放一些控制負載執(zhí)行的腳本,如讀取配置、啟動任務、展示進度、記錄結果等。
以使用mapreduce執(zhí)行bayes作業(yè)為例,工具的執(zhí)行流程如下:首先使用mvn clean package命令編譯整個HiBench工具;然后編輯conf/99-user_defined_properties.conf文件,配置關鍵參數(shù),如hibench.scale.profile表示數(shù)據(jù)規(guī)模、hibench.hadoop.home表示Hadoop的安裝路徑、hibench.hadoop.executable記錄hadoop命令的執(zhí)行位置;再分別運行workloads/bayes/prepare/prepare.sh和 workloads/bayes/mapreduce/bin/run.sh來生成數(shù)據(jù)文件和啟動負載;等待任務執(zhí)行結束后,可以通過查看生成的report/hibench.report文件查看作業(yè)執(zhí)行的時間及集群的吞吐量等結果。
2 加入TPC-DS的方法
首先需要增加執(zhí)行入口。以hive作計算引擎為例,需要增加workloads/tpcds/hive/bin/run.sh文件,主要內(nèi)容如下:
……
show_banner start
CRT_SQL=${SQL_GEN}/create_tb.sql
create_tpcds_tb ${CRT_SQL}
execute_tpcds_query sparksql
show_bannar finish
leave_bench
……
其中${SQL_GEN}為存放TPC-DS創(chuàng)建表語句文件的路徑。
然后在bin/function/workload-functions.sh文件中增加如下函數(shù):
function prepare_tpcds_data(){
sql_scale=$1
cd ${SQL_GEN}
parallel=10
for ((i=1;i<=$parallel;i++))
do
${SQL_GEN}/dsdgen -scale $sql_scale -dir ${SQL_DATA_DIR} -parallel $parallel -child $i 2>/dev/null 1>&2 &
done
wait
tbs=(dbgen_version customer_address customer_ demographics date_dim warehouse ship_mode time_dim reason income_band item store call_center customer web_site store_returns household_demographics web_page promotion catalog_page inventory catalog_returns web_returns web_sales catalog_sales store_sales)
for table in ${tbs[@]}
do
$HADOOP_EXECUTABLE fs -mkdir -p ${OUTPUT_HDFS}/$table 2>/dev/null
$HADOOP_EXECUTABLE fs -rm -r -skipTrash ${OUTPUT_HDFS}/$table/*.dat 2>/dev/null
$HADOOP_EXECUTABLE fs -put ${SQL_DATA_DIR}/${table}*.dat ${OUTPUT_HDFS}/$table 2>/dev/null
done
}
function create_tpcds_tb(){
create_sql_file=$1
rm -f ${create_sql_file}
sed “s#\${TPCDS_DB}#${TPCDS_DB}#g” ${SQL_GEN}/create_tb_template.tpl >> ${create_sql_file}
CMD=“${LOADDATA_EXECUTABLE} -f ${create_sql_file}”
execute_withlog $CMD
}
function execute_tpcds_query(){
exec_type=$1
cd ${SQL_GEN}
CUR_WORKLOAD_TMP=${TPCDS_DB}
for query in ${QUERY_SQL_LIST}
do
${SQL_GEN}/dsqgen -TEMPLATE $query -directory ${SQL_GEN}/query_new -dialect ${exec_type} -scale ${DATASIZE} -output_dir ${W_S_FOLDER}
sed “1 iuse ${TPCDS_DB};” -i ${W_S_FOLDER}/query_0.sql
mv ${W_S_FOLDER}/query_0.sql ${W_S_FOLDER}/${query}.sql
local CUR_WORKLOAD=${CUR_WORKLOAD_TMP}_${query}
echo “execting ${query}”
START_TIME=`timestamp`
CMD=“ ${LOADDATA_EXECUTABLE} -f ${W_S_FOLDER}/${query}.sql”
execute_withlog $CMD
END_TIME=`timestamp`
mv ${W_S_FOLDER}/bench.log ${W_S_FOLDER}/${query}.log
gen_report ${START_TIME} ${END_TIME} 0
}
以上prepare_tpcds_data函數(shù)用于生成TPC-DS工具使用的數(shù)據(jù)并將其傳至HDFS的相應目錄;create_tpcds_tb函數(shù)用于執(zhí)行建表語句,將HDFS數(shù)據(jù)目錄與外表關聯(lián)起來;execute_tpcds_query函數(shù)用于執(zhí)行SQL語句的操作,其中${QUERY_SQL_LIST}為所有需要執(zhí)行查詢的名稱列表。每次做查詢時,會使用dsqgen程序生成一個查詢文件供計算引擎使用;SQL語句執(zhí)行完成后,將執(zhí)行結果放于report目錄下以供查閱,最后通過gen_report函數(shù)生成性能結果。
至此,只要于conf目錄下配置相應的變量即可實現(xiàn)TPC-DS工具的自動化執(zhí)行。