You need to enable JavaScript to run this app.
导航
在EMR集群运行TPC-DS Benchmark
最近更新时间:2023.10.24 14:46:39首次发布时间:2023.02.24 14:54:17
背景信息

TPC-DS测试机制是TPC组织推出用于替代TPC-H的下一代决策支持系统测试基准,本文介绍如何在EMR集群完成运行TPC-DS的99个SQL。

操作流程
步骤一:创建EMR集群
  1. 创建EMR集群,具体操作步骤见:集群创建

    1. 集群类型:Hadoop

    2. 实例规格:如果想获得较好的性能,存算一体场景 core 实例推荐大数据型,存算分离场景core实例推荐本地SSD类型。如果想用小规模集群快速完成所有流程,core实例也可以选择8vCPU 32GiB的通用型实例。

    注意

    如果是存算一体场景,请注意HDFS副本数,务必保证集群的数据盘总量大于数据集规模的三倍以上。

  2. 通过SSH的方式登录ecs实例。详见登录集群

步骤二:创建TPC-DS Benchmark 工具并编译打包数据生成器
  1. 下载TPC-DS Benchmark工具:通过我们已经编译打包好的测试工具链接下载。

    hadoop2x版本hadoop3x版本
    hive-testbench-hdp2.zip
    62.30MB
    hive-testbench-hdp3.zip
    55.03MB
  2. 下载文件;

  3. 上传zip文件到EMR集群,本步骤以本地操作系统为Linux为例,操作命令如下:

    #密码方式
    scp hive-testbench-{hdpx}.zip root@*.*.*.*:/opt
    #秘钥对方法:
    scp -i  **.pem  hive-testbench-{hdpx}.zip root@*.*.*.*:/opt
    

    注意

    如果是秘钥对方式,需要首先对权限进行收敛,执行 chmod 600 **.pem,秘钥对只能在创建秘钥对的时候下载!
    如果是存算分离的集群,也可以将文件上传到 tos 进行下载!具体使用方式可参考:存算分离实践

  4. 在EMR集群解压上传的zip文件

    unzip hive-testbench-{hdpx}.zip
    
  5. 对上传的benchmark测试套进行权限授予:

    cd /opt
    chmod 777 -R hive-testbench-{hdpx}
    
  6. 编译打包数据生成器

    1. git 方式下载,需要进行数据生成,详细步骤如下:

      1. 进入目录:
      cd /opt/hive-testbench-{hdpx}
      
      1. 使用 TPC-DS 工具集进行编译并打包数据生成器:
      ./tpcds-build.sh
      
    2. 如果是本地下载,火山引擎 EMR 提供的安装包已经编译完成,jar 包位置为:/opt/hive-testbench-{hdpx}/tpcds-gen/target/tpcds-gen-1.0-SNAPSHOT.jar,maven 工具也已编译好,存在 /opt/hive-testbench-{hdpx} 中。

步骤三:生成并加载数据

注意事项

1 使用说明

  1. 若您使用的是git下载的地址,需要修改hive命令为火山引擎EMR的命令,详情可参考hive使用说明

  2. 火山提供的工具包默认格式FORMAT=parquet,如需其他格式,请自行变更。

  3. 由于开源Spark3.2.1版本对于Hive写入数据的部分格式不兼容,因此火山提供的工具包中包含Spark导入数据的脚本,为了数据准确建议使用3x版本使用Spark查询Spark导入的数据。

2 如何从指定位置开始运行脚本

由于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 即可。

前置步骤

  1. 在控制台导入用户“tpcdstest”,具体操作可见:https://www.volcengine.com/docs/6491/72166

    注意

    火山提供的脚本默认使用 tpcdstest 用户进行操作,如导入其他用户可能会执行失败。

  2. 【可选】如果开启了ranger权限,需要在Ranger对用户tpcdstest进行授权,授权可参考官网文档https://www.volcengine.com/docs/6491/72195对导入用户进行HDFS、Hive、Yarn的权限授予。

su tpcdstest
bash

脚本执行

存算一体场景

  1. 执行setup脚本
#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

  1. 创建存储使用的tos桶或者文件系统;

    1. 创建tos桶,可参考:tos快速入门
  2. 执行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} &
    
步骤四:运行TPC-DS SQL

本步骤分别介绍如何使用hive和spark运行TPC-DS,主要以工具包中提供的脚本为例进行介绍,如果您有比较常用的查询脚本也可以执行,在这不多做赘述。

Hive

  1. 启动 python 脚本:
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版本可以不填,低于这个版本需要传入版本号。
  1. 查询结果介绍:查询结果在上述填写的日志路径中,选择对应日期进入文件夹即可看到结果,其中:
    1. a_finish.log 表示每个sql的执行时间以及执行结果;

    2. b_finish.csv中包含每个sql的执行时间,本地打开即为excel的格式;

    3. 其余*.sql.log中包含了每个sql的执行日志。

  1. 如果某条sql未通过需要单独调试,可以登录emr-master-1后执行下面命令进行:
#自行替换参数: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

Spark

  1. 启动spark查询脚本
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路径下
  1. 查询结果介绍:查询结果在上述填写的日志路径中,选择对应日期进入文件夹即可看到结果,其中:

    1. a_finish.log 表示每个sql的执行时间以及执行结果;

    2. b_finish.csv中包含每个sql的执行时间,本地打开即为excel的格式;

    3. 其余*.sql.log中包含了每个sql的执行日志。

  2. 如果某条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