TPC-DS是大数据领域最为知名的Benchmark标准。阿里云E-MapReduce多次刷新TPC-DS官方最好成绩,并且是唯一一个通过认证的可运行TPC-DS 100 TB的大数据系统。本文介绍如何在EMR集群完整运行TPC-DS的99个SQL,并得到最佳的性能体验。

背景信息

TPC-DS是全球最知名的数据管理系统评测基准标准化组织TPC(事务性管理委员会)制定的标准规范,并由TPC管理测试结果的发布。TPC-DS官方工具只包含SQL生成器以及单机版数据生成工具,并不适合大数据场景,所以本文教程中使用的工具和集群信息如下:
  • Hive TPC-DS Benchmark测试工具

    该工具是业界最常用的测试工具,是由Hortonworks公司开发,支持使用Hive和Spark运行TPC-DS以及TPC-H等Benchmark。

  • EMR集群版本为EMR-4.8.0。

    Hive TPC-DS Benchmark测试工具是基于Hortonworks HDP 3版本开发的,对应的Hive版本是3.1,所以最适合运行该工具的EMR集群版本为EMR-4.x。本文教程使用的是EMR-4.8.0版本,EMR-4.8.0及之后的版本均可运行该教程。

操作流程

步骤一:创建EMR集群和下载TPC-DS Benchmark工具

  1. 创建EMR-4.8.0集群,具体操作步骤,请参见创建集群
    在创建集群时,请关注如下配置信息:
    • 集群类型:选择Hadoop
    • 实例规格:如果想获得最佳性能,Core实例推荐使用大数据型或本地SSD。如果想能用小规模数据快速完成所有流程,Core实例也可以选择4 vCPU 16 GiB规格的通用型实例。
      注意 根据您选择运行的数据集确定集群规模,确保Core实例的数据盘总容量大于数据集规模的三倍。数据集相关信息,请参见步骤三:生成并加载数据
    • 元数据选择:推荐使用数据湖元数据
    • 挂载公网:开启。
  2. 通过SSH方式连接EMR集群,具体操作步骤,请参见登录集群
  3. 安装Git和Maven。
    sudo yum install -y git maven
  4. 下载TPC-DS Benchmark工具。
    • 通过Git下载。
      git clone https://github.com/hortonworks/hive-testbench.git
      注意 中国内地(大陆)地域的节点访问GitHub较慢,如果下载失败,可直接本地下载,将ZIP文件上传到EMR集群,并解压缩。
    • 本地下载,将ZIP文件上传到EMR集群,并解压缩。
      具体操作步骤如下:
      1. 下载hive-testbench-hdp3.zip文件
      2. 修改下载的hive-testbench-hdp3.zip文件名称为hive-testbench.zip
      3. 上传ZIP文件到EMR集群。本步骤以本地操作系统为Linux为例介绍,操作命令如下:
        scp hive-testbench.zip root@xx.xx.xx.xx:/root/
        说明 xx.xx.xx.xx为EMR集群公网IP地址。获取方式,请参见获取主节点公网IP地址
      4. 在EMR集群解压缩上传的ZIP文件。
        unzip hive-testbench.zip

步骤二:编译并打包数据生成器

  1. (可选)配置阿里云镜像。
    在中国内地(大陆)地区加速Maven编译,可以使用阿里云镜像。使用阿里云镜像,编译并打包数据生成器的耗时为2min~3min。
    1. 执行如下命令,新建文件目录。
      mkdir -p ~/.m2/
    2. 执行如下命令,将Maven配置文件拷贝到新文件目录下。
      cp /usr/share/maven/conf/settings.xml ~/.m2/
    3. ~/.m2/settings.xml文件中添加镜像信息,具体内容如下:
      <mirror>
          <id>aliyun</id>
          <mirrorOf>central</mirrorOf>
          <name>Nexus aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
      </mirror>
  2. 切换到hive-testbench目录。
    cd hive-testbench
  3. 使用TPC-DS工具集进行编译并打包数据生成器。
    ./tpcds-build.sh

步骤三:生成并加载数据

  1. 设置数据规模SF(Scale Factor)。

    SF单位相当于GB,所以SF=1相当于1 GB,SF=100相当于100 GB,SF=1000相当于1 TB,以此类推。本步骤示例采用小规模数据集,推荐使用SF=3。具体命令如下:

    SF=3
    注意 请确保数据盘总大小是数据集规模的3倍以上,否则后续流程中会出现报错情况。
  2. 检查并清理Hive数据库。
    1. 检查Hive数据库是否存在。
      hive -e "desc database tpcds_bin_partitioned_orc_$SF"
    2. (可选)清理已经存在的Hive数据库。
      注意 如果Hive数据库tpcds_bin_partitioned_orc_$SF已经存在,需要执行下面的命令清理数据库,否则后续流程会报错。如果不存在,则跳过该步骤。
      hive -e "drop database tpcds_bin_partitioned_orc_$SF cascade"
  3. 配置Hive服务地址。
    tpcds-setup.sh脚本默认配置的Hive服务地址与EMR集群环境不一致,所以需要将脚本中HiveSever的地址替换为EMR集群中的Hive服务地址。具体命令如下:
    sed -i 's/localhost:2181\/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=default/emr-header-1:10000\//' tpcds-setup.sh

    脚本默认配置的Hive服务地址为:jdbc:hive2://localhost:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=default。通过上述命令替换后的Hive服务地址为:jdbc:hive2://emr-header-1:10000/

  4. 生成并加载数据。
    在SF=3时,该步骤耗时为40min~50min。如果运行正常,TPC-DS数据表将会加载到tpcds_bin_partitioned_orc_$SF数据库中。生成的数据可以保存在HDFS和OSS,针对这两种场景具体的操作如下:
    • 使用HDFS存储数据的场景。
      EMR集群默认将TPC-DS Table数据保存在HDFS上。执行如下命令生成并加载数据:
      ./tpcds-setup.sh $SF
      初始化
    • 使用OSS存储数据的场景。
      通过EMR存储和计算分离的架构能力,可以很方便的做到将数据保存在OSS。具体操作步骤如下:
      1. 使用Hive命令修改数据库路径。
        hive --hivevar SF=$SF
        create database if not exists tpcds_bin_partitioned_orc_${SF};
        alter database tpcds_bin_partitioned_orc_${SF} set location 'oss://<bucket-name>/warehouse/tpcds_bin_partitioned_orc_${SF}.db';

        <bucket-name>需要改成和EMR集群在同一地域的OSS Bucket名称。

      2. 生成并加载据。
        cd ~/hive-testbench
        ./tpcds-setup.sh $SF
        说明 执行以上命令后,生成的数据就直接保存在OSS上了。如果您同时使用了数据湖构建(DLF)来保存Hive表的元数据,数据生成后,您可以随时释放当前的EMR集群,并在同一地域的其他EMR集群上再次查询当前生成的TPC-DS数据集。
  5. 获取Hive表统计信息。
    推荐使用Hive SQL ANALYZE命令获取Hive表统计信息,可以加快后续SQL的查询速度。此步骤在SF=3时,耗时为20min~30min。
    hive -f ./ddl-tpcds/bin_partitioned/analyze.sql \
        --hiveconf hive.execution.engine=tez \
        --database tpcds_bin_partitioned_orc_$SF

步骤四:运行TPC-DS SQL

本步骤分别介绍如何使用Hive和Spark运行TPC-DS SQL。

  • 使用Hive运行TPC-DS SQL。
    • 通过以下命令执行单SQL。
      TPC-DS SQL共有99个文件都放在sample-queries-tpcds工作目录下(包括query10.sqlquery11.sql等文件)。在SF=3时,所有的SQL都可以在5min内返回结果。
      注意 因为TPC-DS Query和数据都是随机生成,所以部分SQL查询返回结果数为0属于正常现象。
      cd sample-queries-tpcds
      hive --database tpcds_bin_partitioned_orc_$SF
      set hive.execution.engine=tez;
      source query10.sql;
    • 利用工具包中的脚本顺序执行99个完整SQL。具体命令如下:
      cd ~/hive-testbench
      # 生成一个Hive配置文件,并指定Hive执行引擎为Tez。
      echo 'set hive.execution.engine=tez;' > sample-queries-tpcds/testbench.settings
      ./runSuite.pl tpcds $SF
      批量执行SQL
  • 使用Spark运行TPC-DS SQL。

    TPC-DS工具集中包含Spark SQL用例,用例位于spark-queries-tpcds目录下,可以使用spark-sql或者spark-beeline等命令行工具执行这些SQL。本步骤以Spark Beeline工具连接Spark ThriftServer为例,介绍如何使用Spark运行TPC-DS SQL来查询步骤三生成的TPC-DS数据集。

    说明 EMR Spark支持HDFS和OSS等多种存储介质保存的数据表,也支持数据湖构建(DLF)元数据。
    1. 使用Spark Beeline ANALYZE命令获得Hive表统计信息,加快后续SQL查询速度。
      cd ~/hive-testbench
      spark-beeline -u jdbc:hive2://emr-header-1:10001/tpcds_bin_partitioned_orc_$SF \
        -f ./ddl-tpcds/bin_partitioned/analyze.sql
    2. 切换到Spark SQL用例所在的文件目录。
      cd spark-queries-tpcds/
    3. 执行SQL。
      • 通过以下命令执行单个SQL。
        spark-beeline -u jdbc:hive2://emr-header-1:10001/tpcds_bin_partitioned_orc_$SF -f q1.sql
      • 通过脚本顺序执行99个SQL。
        TPC-DS工具集中没有包含批量执行Spark SQL的脚本,所以本步骤提供一个简单脚本供参考。
        for q in `ls *.sql`; do
          spark-beeline -u jdbc:hive2://emr-header-1:10001/tpcds_bin_partitioned_orc_$SF -f $q > $q.out
        done
        注意
        • SQL列表中q30.sql文件存在列名c_last_review_date_sk错写为c_last_review_date的情况,所以该SQL运行失败属于正常现象。
        • 通过脚本顺序执行99个Spark SQL的时候,如果出现报错情况,解决方案请参见常见问题

常见问题

Q:通过脚本顺序执行99个Spark SQL的时候报错,报错信息为Error: org.apache.thrift.transport.TTransportException: java.net.SocketException: 断开的管道 (Write failed) (state=08S01,code=0) Closing: 0: jdbc:hive2://emr-header-1:10001/tpcds_bin_partitioned_orc_**,怎么解决?

A:Spark ThriftServer服务的默认内存不适合较大规模数据集测试,如果在测试过程中出现Spark SQL作业提交失败,原因可能是Spark ThriftServer出现OutOfMemory异常。针对这种情况的解决方法为调整Spark服务配置spark_thrift_daemon_memory的值后重启ThriftServer服务。具体操作步骤如下:
  1. 进入Spark服务页面。
    1. 登录阿里云E-MapReduce控制台
    2. 在顶部菜单栏处,根据实际情况选择地域和资源组
    3. 单击上方的集群管理页签。
    4. 集群管理页面,单击相应集群所在行的详情
    5. 在左侧导航栏,选择集群服务 > Spark
  2. 调整服务配置spark_thrift_daemon_memory的值。
    1. 在Spark服务页面,单击配置页签。
    2. 配置搜索区域,输入spark_thrift_daemon_memory,单击搜索图标。
    3. 根据使用的数据集规模调整对应的数值。

      您可以将默认的1g调整为2g或者更大的数值。

    4. 单击右上角的保存
    5. 确认修改对话框中,输入执行原因,单击确定
  3. 重启Spark ThriftServer。
    1. 在Spark服务页面,选择右上角操作 > 重启ThriftServer
    2. 执行集群操作对话框中,输入执行原因,单击确定
    3. 确认对话框中,单击确定