劉建鵬 劉堯
摘要:TPC-DS是事務(wù)性能管理委員會(huì)(TPC)組織發(fā)布的一種數(shù)據(jù)庫(kù)評(píng)測(cè)基準(zhǔn),其中共包含99種查詢語(yǔ)句,涵蓋各種復(fù)雜的SQL應(yīng)用,與真實(shí)數(shù)據(jù)一致。但是執(zhí)行時(shí)生成數(shù)據(jù)、生成查詢語(yǔ)句、執(zhí)行語(yǔ)句都需要手動(dòng)操作,使用起來(lái)較為不方便。本文介紹一種將TPC-DS工具合入HiBench測(cè)試框架的方法。
關(guān)鍵詞:TPC-DS;HiBench;性能測(cè)試
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2019)10-0064-02
HiBench是一個(gè)大數(shù)據(jù)性能測(cè)試套件,可以用來(lái)測(cè)試一個(gè)Hadoop集群對(duì)于各種常見(jiàn)任務(wù)的處理速度。可以對(duì)MapReduce、Spark、Flink、Hdfs等組件進(jìn)行性能測(cè)試,支持的負(fù)載包括文件讀寫(xiě)、圖處理、機(jī)器學(xué)習(xí)、數(shù)據(jù)庫(kù)操作等類(lèi)型。但是HiBench提供的SQL類(lèi)執(zhí)行語(yǔ)句較少,主要是Join、Aggregation操作。而TPC-DS工具包含了大量的SQL語(yǔ)句,但并沒(méi)有提供便捷的使用方法。因此我們結(jié)合兩種測(cè)試工具,將TPC-DS合入HiBench框架進(jìn)行執(zhí)行。
1 HiBench框架介紹
以HiBench5.0版本為例,根目錄下有四個(gè)目錄,分別是src、bin、conf、workloads。src目錄存放待執(zhí)行負(fù)載的源代碼,編譯后生成jar包;conf目錄存放大部分的配置,如數(shù)據(jù)規(guī)模、大數(shù)據(jù)組件的路徑、集群節(jié)點(diǎn)數(shù)等;workloads目錄存放各個(gè)負(fù)載的執(zhí)行入口;bin目錄存放一些控制負(fù)載執(zhí)行的腳本,如讀取配置、啟動(dòng)任務(wù)、展示進(jìn)度、記錄結(jié)果等。
以使用mapreduce執(zhí)行bayes作業(yè)為例,工具的執(zhí)行流程如下:首先使用mvn clean package命令編譯整個(gè)HiBench工具;然后編輯conf/99-user_defined_properties.conf文件,配置關(guān)鍵參數(shù),如hibench.scale.profile表示數(shù)據(jù)規(guī)模、hibench.hadoop.home表示Hadoop的安裝路徑、hibench.hadoop.executable記錄hadoop命令的執(zhí)行位置;再分別運(yùn)行workloads/bayes/prepare/prepare.sh和 workloads/bayes/mapreduce/bin/run.sh來(lái)生成數(shù)據(jù)文件和啟動(dòng)負(fù)載;等待任務(wù)執(zhí)行結(jié)束后,可以通過(guò)查看生成的report/hibench.report文件查看作業(yè)執(zhí)行的時(shí)間及集群的吞吐量等結(jié)果。
2 加入TPC-DS的方法
首先需要增加執(zhí)行入口。以hive作計(jì)算引擎為例,需要增加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)建表語(yǔ)句文件的路徑。
然后在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的相應(yīng)目錄;create_tpcds_tb函數(shù)用于執(zhí)行建表語(yǔ)句,將HDFS數(shù)據(jù)目錄與外表關(guān)聯(lián)起來(lái);execute_tpcds_query函數(shù)用于執(zhí)行SQL語(yǔ)句的操作,其中${QUERY_SQL_LIST}為所有需要執(zhí)行查詢的名稱(chēng)列表。每次做查詢時(shí),會(huì)使用dsqgen程序生成一個(gè)查詢文件供計(jì)算引擎使用;SQL語(yǔ)句執(zhí)行完成后,將執(zhí)行結(jié)果放于report目錄下以供查閱,最后通過(guò)gen_report函數(shù)生成性能結(jié)果。
至此,只要于conf目錄下配置相應(yīng)的變量即可實(shí)現(xiàn)TPC-DS工具的自動(dòng)化執(zhí)行。