刘建鹏 刘尧
摘要:TPC-DS是事务性能管理委员会(TPC)组织发布的一种数据库评测基准,其中共包含99种查询语句,涵盖各种复杂的SQL应用,与真实数据一致。但是执行时生成数据、生成查询语句、执行语句都需要手动操作,使用起来较为不方便。本文介绍一种将TPC-DS工具合入HiBench测试框架的方法。
关键词:TPC-DS;HiBench;性能测试
中图分类号:TP311 文献标识码:A 文章编号:1007-9416(2019)10-0064-02
HiBench是一个大数据性能测试套件,可以用来测试一个Hadoop集群对于各种常见任务的处理速度。可以对MapReduce、Spark、Flink、Hdfs等组件进行性能测试,支持的负载包括文件读写、图处理、机器学习、数据库操作等类型。但是HiBench提供的SQL类执行语句较少,主要是Join、Aggregation操作。而TPC-DS工具包含了大量的SQL语句,但并没有提供便捷的使用方法。因此我们结合两种测试工具,将TPC-DS合入HiBench框架进行执行。
1 HiBench框架介绍
以HiBench5.0版本为例,根目录下有四个目录,分别是src、bin、conf、workloads。src目录存放待执行负载的源代码,编译后生成jar包;conf目录存放大部分的配置,如数据规模、大数据组件的路径、集群节点数等;workloads目录存放各个负载的执行入口;bin目录存放一些控制负载执行的脚本,如读取配置、启动任务、展示进度、记录结果等。
以使用mapreduce执行bayes作业为例,工具的执行流程如下:首先使用mvn clean package命令编译整个HiBench工具;然后编辑conf/99-user_defined_properties.conf文件,配置关键参数,如hibench.scale.profile表示数据规模、hibench.hadoop.home表示Hadoop的安装路径、hibench.hadoop.executable记录hadoop命令的执行位置;再分别运行workloads/bayes/prepare/prepare.sh和 workloads/bayes/mapreduce/bin/run.sh来生成数据文件和启动负载;等待任务执行结束后,可以通过查看生成的report/hibench.report文件查看作业执行的时间及集群的吞吐量等结果。
2 加入TPC-DS的方法
首先需要增加执行入口。以hive作计算引擎为例,需要增加workloads/tpcds/hive/bin/run.sh文件,主要内容如下:
……
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创建表语句文件的路径。
然后在bin/function/workload-functions.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函數用于生成TPC-DS工具使用的数据并将其传至HDFS的相应目录;create_tpcds_tb函数用于执行建表语句,将HDFS数据目录与外表关联起来;execute_tpcds_query函数用于执行SQL语句的操作,其中${QUERY_SQL_LIST}为所有需要执行查询的名称列表。每次做查询时,会使用dsqgen程序生成一个查询文件供计算引擎使用;SQL语句执行完成后,将执行结果放于report目录下以供查阅,最后通过gen_report函数生成性能结果。
至此,只要于conf目录下配置相应的变量即可实现TPC-DS工具的自动化执行。