TPC-DS作为大数据行业中最权威且被广泛认可的基准测试标准,用于衡量大规模数据处理系统的性能与效率的关键指标。阿里云EMR是第一个通过认证的可运行TPC-DS 100 TB的大数据系统。本文介绍如何在EMR集群环境下,充分利用OSS-HDFS服务的优势,成功执行TPC-DS Benchmark的99个SQL查询,并通过一系列优化策略实现更优的性能体验。
使用场景
大数据性能评估
当您希望评估使用OSS-HDFS服务作为Hadoop数据存储时的大数据处理性能,特别是对于大规模数据分析和查询优化工作负载,TPC-DS可以作为标准的决策支持系统基准测试工具。
数据湖架构验证
如果您正在构建或已经拥有基于阿里云OSS的数据湖架构,并且想验证其在复杂查询处理、ETL作业、数据仓库性能等方面的效率,可以通过在EMR集群上运行TPC-DS来获得客观、标准化的结果。
了解性能表现
当您进行集群扩容、硬件升级或者调整存储策略时,利用TPC-DS Benchmark可以帮助您了解随着数据量的增长和计算资源的变化,系统的整体性能表现。
成本效益分析
OSS作为对象存储服务,相比传统HDFS在成本结构上有一定优势。通过实测OSS-HDFS在TPC-DS下的性能,可以结合成本因素来确定是否适用于特定业务场景,从而作出更具经济效益的选择。
背景信息
TPC-DS作为全球权威的数据管理系统评测标准之一,由TPC组织设计和维护,但其官方提供的工具集主要服务于单机数据生成与SQL查询执行,并不适合直接应用于大规模分布式环境下的性能评估。为适用于大数据分析场景,您需要准备以下工具和EMR集群:
该工具由Hortonworks开发,专为Hadoop生态系统中的Hive及Spark等组件定制,能够有效模拟大数据查询挑战,并支持在集群环境下生成和执行TPC-DS以及TPC-H标准中的复杂SQL查询。
5.15.1及以上版本EMR集群
要求使用EMR-5.15.1及以上版本的EMR集群,该版本集群兼容并支持Hortonworks Data Platform (HDP) 3系列,对应的Hive版本是3.1。
步骤1:创建EMR集群和下载TPC-DS Benchmark工具
创建EMR-5.15.1及以上版本的集群。
创建EMR集群时,请关注以下配置信息,其他配置项的说明,请参见创建集群。
模块
配置项
说明
软件设置
业务场景
选择新版数据湖。
元数据
选择DLF统一元数据。
集群存储根路径
选择已开启OSS-HDFS服务的Bucket。
硬件配置
节点组
emr-master节点开启挂载公网。
如果想获得最佳性能,emr-core节点实例规格推荐使用大数据型或本地SSD。如果希望用小规模数据快速完成所有流程,emr-core节点实例规格也可以选择通用型4 vCPU 16 GiB。
重要根据您选择运行的数据集确定集群规模,确保Core实例的数据盘总容量大于数据集规模的三倍。数据集相关信息,请参见步骤3:生成并加载数据。
通过SSH方式连接EMR集群的emr-master节点。具体操作,请参见登录集群。
安装Git和Maven。
执行以下命令,安装Git。
sudo yum install -y git
在Apache Maven Project下载最新的Binary tar.gz archive,例如apache-maven-3.9.6-bin.tar.gz。
将下载的文件上传到EMR集群的Master节点,并解压。
tar zxf apache-maven-3.9.6-bin.tar.gz
配置环境变量。
切换至apache-maven-3.9.6目录。
cd apache-maven-3.9.6
配置环境变量。
export MAVEN_HOME=`pwd` export PATH=`pwd`/bin:$PATH
下载TPC-DS Benchmark工具。
下载工具。
通过Git下载
在中国内地访问GitHub较慢,如果下载失败,可直接通过本地下载。
git clone https://github.com/hortonworks/hive-testbench.git
通过本地下载hive-testbench-hdp3.zip文件。
上传ZIP文件到EMR集群的emr-master节点。
在EMR集群的emr-master节点,执行以下命令解压缩ZIP文件。
unzip hive-testbench-hdp3.zip
步骤2:编译并打包数据生成器
(可选)配置阿里云镜像。
如果在中国内地可以使用阿里云镜像加速Maven编译。使用阿里云镜像,编译并打包数据生成器的耗时为2min~3min。
执行如下命令,新建文件目录。
mkdir -p ~/.m2/
执行如下命令,将Maven配置文件拷贝到新文件目录下。
cp $MAVEN_HOME/conf/settings.xml ~/.m2/
在~/.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>
切换到hive-testbench-hdp3目录。
cd hive-testbench-hdp3
下载tpcds-extern.patch文件,上传到当前目录下,然后通过以下命令复制到
tpcds-gen/patches/all/
目录中。cp tpcds-extern.patch ./tpcds-gen/patches/all/
使用TPC-DS工具集进行编译并打包数据生成器。
./tpcds-build.sh
步骤3:生成并加载数据
设置数据规模SF(Scale Factor)。
SF单位相当于GB,所以SF=1相当于1 GB,SF=100相当于100 GB,SF=1000相当于1 TB,以此类推。本步骤示例采用小规模数据集,推荐使用SF=3。具体命令如下:
SF=3
重要请确保数据盘总大小是数据集规模的3倍以上,否则后续流程中会出现报错情况。
检查并清理Hive数据库。
检查Hive数据库是否存在。
hive -e "desc database tpcds_bin_partitioned_orc_$SF"
(可选)清理已经存在的Hive数据库。
重要如果Hive数据库tpcds_bin_partitioned_orc_$SF已经存在,需要执行下面的命令清理数据库,否则后续流程会报错。如果不存在,则跳过该步骤。
hive -e "drop database tpcds_bin_partitioned_orc_$SF cascade"
配置Hive服务地址。
tpcds-setup.sh脚本默认配置的Hive服务地址与EMR集群环境不一致,所以需要将脚本中HiveSever的地址替换为EMR集群中的Hive服务地址。具体命令如下:
sed -i 's/localhost:2181\/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=default/master-1-1:10000\//' tpcds-setup.sh
脚本默认配置的Hive服务地址为:
jdbc:hive2://localhost:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=default
。通过上述命令替换后的Hive服务地址为:jdbc:hive2://master-1-1:10000/
。修复开源工具配置问题。
部分参数在Hive 2和Hive 3等开源版本中不支持,继续使用TPC-DS会导致作业报错,所以需要参考以下命令替换参数。
sed -i 's/hive.optimize.sort.dynamic.partition.threshold=0/hive.optimize.sort.dynamic.partition=true/' settings/*.sql
生成并加载数据。
在SF=3时,该步骤耗时约40min~50min。如果运行正常,TPC-DS数据表将会加载到tpcds_bin_partitioned_orc_$SF数据库中。生成的数据会自动保存到创建EMR集群时指定的存储根路径(即已开通OSS-HDFS服务的Bucket根目录)。执行如下命令加载数据:
./tpcds-setup.sh $SF
获取Hive表统计信息。
推荐使用Hive SQL ANALYZE命令获取Hive表统计信息,可以加快后续SQL的查询速度。此步骤在SF=3时,耗时为20min~30min。
hive -f ./hive-testbench-hdp3/ddl-tpcds/bin_partitioned/analyze.sql \ --hiveconf hive.execution.engine=tez \ --database tpcds_bin_partitioned_orc_$SF
步骤4:运行TPC-DS SQL
本步骤分别介绍如何使用Hive和Spark运行TPC-DS SQL。
使用Hive运行TPC-DS SQL
通过以下命令执行单SQL。
TPC-DS SQL共有99个文件都放在sample-queries-tpcds工作目录下(包括query10.sql和query11.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-hdp3 # 生成一个Hive配置文件,并指定Hive执行引擎为Tez。 echo 'set hive.execution.engine=tez;' > sample-queries-tpcds/testbench.settings ./runSuite.pl tpcds $SF
使用Spark运行TPC-DS SQL
TPC-DS工具集中包含Spark SQL用例,用例位于spark-queries-tpcds目录下,可以使用spark-sql
或者spark-beeline
等命令行工具执行这些SQL。本步骤以Spark Beeline工具连接Spark ThriftServer为例,介绍如何使用Spark运行TPC-DS SQL来查询步骤3生成的TPC-DS数据集。
EMR Spark支持HDFS和OSS等多种存储介质保存的数据表,也支持数据湖构建(DLF)元数据。
使用Spark Beeline ANALYZE命令获得Hive表统计信息,加快后续SQL查询速度。
cd ~/hive-testbench-hdp3 spark-beeline -u jdbc:hive2://master-1-1:10001/tpcds_bin_partitioned_orc_$SF \ -f ./ddl-tpcds/bin_partitioned/analyze.sql
切换到Spark SQL用例所在的文件目录。
cd spark-queries-tpcds/
通过以下命令执行单个SQL。
spark-beeline -u jdbc:hive2://master-1-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://master-1-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运行失败属于正常现象。