TPC-DS测试机制是TPC组织推出用于替代TPC-H的下一代决策支持系统测试基准,本文介绍如何在EMR集群完成运行TPC-DS的99个SQL。
创建EMR集群,具体操作步骤见:集群创建
集群类型:Hadoop
实例规格:如果想获得较好的性能,存算一体场景 core 实例推荐大数据型,存算分离场景core实例推荐本地SSD类型。如果想用小规模集群快速完成所有流程,core实例也可以选择8vCPU 32GiB的通用型实例。
注意
如果是存算一体场景,请注意HDFS副本数,务必保证集群的数据盘总量大于数据集规模的三倍以上。
通过SSH的方式登录ecs实例。详见登录集群。
下载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} 中。
若您使用的是git下载的地址,需要修改hive命令为火山引擎EMR的命令,详情可参考hive使用说明
火山提供的工具包默认格式FORMAT=parquet,如需其他格式,请自行变更。
由于开源Spark3.2.1版本对于Hive写入数据的部分格式不兼容,因此火山提供的工具包中包含Spark导入数据的脚本,为了数据准确建议使用3x版本使用Spark查询Spark导入的数据。
由于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”,具体操作可见:https://www.volcengine.com/docs/6491/72166。
注意
火山提供的脚本默认使用 tpcdstest 用户进行操作,如导入其他用户可能会执行失败。
【可选】如果开启了ranger权限,需要在Ranger对用户tpcdstest进行授权,授权可参考官网文档https://www.volcengine.com/docs/6491/72195对导入用户进行HDFS、Hive、Yarn的权限授予。
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} &
创建存储使用的tos桶或者文件系统;
执行setup脚本
#参数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版本可以不填,低于这个版本需要传入版本号。 |
a_finish.log 表示每个sql的执行时间以及执行结果;
b_finish.csv中包含每个sql的执行时间,本地打开即为excel的格式;
其余*.sql.log中包含了每个sql的执行日志。
#自行替换参数: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路径下 |
查询结果介绍:查询结果在上述填写的日志路径中,选择对应日期进入文件夹即可看到结果,其中:
a_finish.log 表示每个sql的执行时间以及执行结果;
b_finish.csv中包含每个sql的执行时间,本地打开即为excel的格式;
其余*.sql.log中包含了每个sql的执行日志。
如果某条sql未通过需要单独调试,可以执行下面命令进行:
#自行替换参数: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