TPC-DS测试机制是TPC组织推出用于替代TPC-H的下一代决策支持系统测试基准,本文介绍如何在EMR集群完成运行TPC-DS的99个SQL。
注意
如果是存算一体场景,请注意HDFS副本数,务必保证集群的数据盘总量大于数据集规模的三倍以上。
下载TPC-DS Benchmark工具:通过我们已经编译打包好的测试工具链接下载。
hadoop2x版本 | hadoop3x版本 |
|---|---|
下载文件;
上传zip文件到EMR集群,本步骤以本地操作系统为Linux为例,操作命令如下:
#密码方式 scp hive-testbench-{hdpx}.zip root@*.*.*.*:/opt #秘钥对方法: scp -i **.pem hive-testbench-{hdpx}.zip root@*.*.*.*:/opt
注意
如果是秘钥对方式,需要首先对权限进行收敛,执行 chmod 600 **.pem,秘钥对只能在创建秘钥对的时候下载!
如果是存算分离的集群,也可以将文件上传到 tos 进行下载!具体使用方式可参考:存算分离实践
在EMR集群解压上传的zip文件
unzip hive-testbench-{hdpx}.zip
对上传的benchmark测试套进行权限授予:
cd /opt chmod 777 -R hive-testbench-{hdpx}
编译打包数据生成器
git 方式下载,需要进行数据生成,详细步骤如下:
cd /opt/hive-testbench-{hdpx}
./tpcds-build.sh
如果是本地下载,火山引擎 EMR 提供的安装包已经编译完成,jar 包位置为:/opt/hive-testbench-{hdpx}/tpcds-gen/target/tpcds-gen-1.0-SNAPSHOT.jar,maven 工具也已编译好,存在 /opt/hive-testbench-{hdpx} 中。
由于TPCDS有多条SQL,脚本默认是从第一条SQL开始运行,对于部分场景下,存在需要跳过部分SQL开始的情况,对于此场景,可以修改脚本实现,以hive_perftest.py为例,在脚本的第41行,也就是:
for s in res.split('\n'):
此for循环前后添加如下代码:
continue_flag = True start_sql = "query64.sql" for s in res.split('\n'): if s == start_sql: continue_flag = False if continue_flag: continue log_name = "/opt/hive-testbench-{hdpx}/log/hiveon{engine}/{dir}/{sql}.log".format(engine=engine, sql=s, dir=start_time) cmd = "-f /opt/hive-testbench-{hdpx}/sample-queries-tpcds/{sql} > {dir} 2>&1".format(sql=s, dir=log_name) cmd = base + cmd res = subprocess.run(cmd, shell=True) with open(log_name, 'r') as f: with open(res_log, 'a') as log:
其中query64.sql为起点 SQL,按照您需要替换成自己需要的开始 SQL 即可。
注意
火山提供的脚本默认使用 tpcdstest 用户进行操作,如导入其他用户可能会执行失败。
su tpcdstest bash
#tpcds-setup.sh 脚本中的DATABASE是实际写入的数据库。 #参数1:FORMAT为运行脚本生成的表格式,缺省值为parquet,支持orc,parquet和textfile。也可以通过export FORMAT=parquet 的方式设置全局变量指定。 #参数2:$SCALE-数据规模,需要替换。 #参数3:数据存储路径,passwd:导入用户的密码,导入用户时自己配置的。 #后台执行,hivesql导入内表命令 FORMAT=parquet nohup ./tpcds-setup.sh {SCALE} /hivedata {passwd} & #后台执行,sparksql导入内表命令 FORMAT=parquet nohup ./tpcds-setup-sparksql.sh {SCALE} /hivedata {passwd} &

#参数1:FORMAT为运行脚本生成的表格式,缺省值为parquet,支持orc,parquet和textfile。 #参数2:$SCALE-数据规模,需要替换。 #参数3:数据存储路径,passwd:导入用户的密码,导入用户时自己配置的。 #hivesql导入命令 nohup FORMAT=parquet ./tpcds-setup.sh {SCALE} 'tos://您的bucket name/hivedata' {passwd} & #可以sparksql导入命令 nohup FORMAT=parquet ./tpcds-setup-sparksql.sh {SCALE} 'tos://您的bucket name/hivedata' {passwd} &
本步骤分别介绍如何使用hive和spark运行TPC-DS,主要以工具包中提供的脚本为例进行介绍,如果您有比较常用的查询脚本也可以执行,在这不多做赘述。
nohup python3 /opt/hive-testbench-{hdpx}/hive_perftest.py --db_name={DB} --hive_pwd={pwd} --test_engine={engine} --cluster_type={is_ha} --resultPwd={logdir} --cluster_version={version} &
参数说明:
参数名称 | 是否必须 | 说明 |
|---|---|---|
{DB} | 是 | 需要查询的DB名称,示例:tpcds_bin_partitioned_parquet_2 |
{pwd} | 是 | 导入用户的密码,导入用户时自己配置的。 |
{engine} | 是 | 查询的引擎,可选择:tez,mr,spark |
{is_ha} | 否 | 是否是ha集群,可选择:HA,NHA,不提交默认为HA |
{logdir} | 否 | 生成日志路径,自定义即可,如果没有填写默认在:/opt/hive-testbench-{hdpx}/log/hivesql/1路径下 |
{version} | 否 | 集群版本号,默认3.5.0/2.4.0,高于3.5.0/2.4.0版本可以不填,低于这个版本需要传入版本号。 |

#自行替换参数:pwd: hive 密码,i:执行第几个query DB:查询的数据库 beeline -n tpcdstest -p {pwd} -u 'jdbc:hive2://localhost:2181/{DB};serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=default' --hiveconf hive.tez.container.size=6144 -i /opt/hive-testbench-{hdpx}/settings/hivetest.sql -f /opt/hive-testbench-{hdpx}/sample-queries-tpcds/query{i}.sql
nohup python3 /opt/hive-testbench-{hdpx}/sparksql_perftest.py --db_name={DB} --resultPwd={logdir} &
参数名称 | 是否必须 | 说明 |
|---|---|---|
{DB} | 是 | 需要查询的DB名称,示例:tpcds_bin_partitioned_parquet_2 |
{logdir} | 否 | 生成日志路径,自定义即可,如果没有填写默认在:/opt/hive-testbench-{hdpx}/log/sparksql/1路径下 |
#自行替换参数:DB:查询的数据库 i:执行第几个query spark-sql --master yarn --driver-memory 10g --executor-memory 5g --num-executors 60 --database {DB} -v -f /opt/hive-testbench-{hdpx}/spark-queries-tpcds/q$i.sql