1.hive-testbench 简介
hive-testbench 是一个用于测试和基准测试 Apache Hive 的工具集。它提供了一系列的测试数据集和查询样例,用于评估和比较 Hive 在不同配置和环境下的性能。hive-testbench 的主要目标是模拟真实的大规模数据集和复杂查询场景,以帮助用户评估和优化 Hive 的性能。
hive-testbench 包含了 TPC-DS 和 TPCH 的各种不同规模的数据集,从几百兆到几十亿行的数据规模,以及包含多个表和复杂查询的查询样例。
说明:
- TPC-DS:是一个面向决策支持系统的包含多维度常规应用模型的决策支持基准,定义了 25 张表、99 个查询
- TPC-H:用来评估在线分析处理的基准程序,主要模拟了供应商和采购商之间的交易行为,包含了 8 张表、22 个查询。
2.入门教程
前提条件
1.安装和配置 Hive。
2.下载 hive-testbench
问题1:TPC-DS 性能测试场景下,如何生成 10GB 的 ORC 文件格式的 Hive 数据集
# 进入 hive-testbench 的根目录
# 步骤1:构建数据生成器
$ ./tpcds-build.sh
# 步骤2:运行脚本生成数据集
$./tpcds-setup.sh 10
问题2:TPC-DS 性能测试场景下,如何生成 1TB 的 RCFile 文件格式的 Hive 数据集
# 进入 hive-testbench 的根目录
# 步骤1:构建数据生成器
$ ./tpcds-build.sh
# 步骤2:设置 环境变量并运行脚本生成数据集
$export FORMAT=rcfile
$./tpcds-setup.sh 1000
问题2:TPC-DS 性能测试场景下,如何生成 500GB 的 TXT文件格式的 Hive 数据集
# 进入 hive-testbench 的根目录
# 步骤1:构建数据生成器
$ ./tpcds-build.sh
# 步骤2:设置 环境变量并运行脚本生成数据集
$export FORMAT=txt
$./tpcds-setup.sh 500
问题4:TPC-H 性能测试场景下,如何生成 100GB 的 ORC 文件格式的 Hive 数据集
# 进入 hive-testbench 的根目录
# 步骤1:构建数据生成器
$ ./tpch-build.sh
# 步骤2:运行脚本生成数据集
$./tpch-setup.sh 100
3.分析 hive-testbench 的工作流程
说明:执行脚本
tpcds-build.sh
可以构建出./tpcds-gen/target/tpcds-gen-1.0-SNAPSHOT.jar
,而tpch-build.sh
可以构建出./tpch-gen/target/tpch-gen-1.0-SNAPSHOT.jar
下面以脚本 tpcds-setup.sh
生成 ORC 格式、10GB 的 HIve 数据集为例,剖析 hive-testbench 的工作流程。
① 验证参数:脚本首先会验证输入的参数是否正确,包括存储格式 FORMAT
、数据规模 SCALE
等参数。
② 设置环境变量:脚本会设置一些环境变量,如 Hadoop、Hive、TPC-DS 数据生成器等的路径。
③ 生成 TPC-DS 数据集:脚本会调用 TPC-DS 数据生成器生成 TPC-DS 数据集。这个过程包括以下几个步骤:
- 在 hdfs 中生成 txt 数据文件:脚本会调用 TPC-DS 数据生成器生成相应规模因子的数据集。生成的数据包括多个表,每个表包含多个分区的数据。
# 在脚本tpcds-setup.sh 中
# 在 Hadoop 分布式环境中运行打包成 JAR 文件的 Hadoop 应用程序
if [ $? -ne 0 ]; then
echo "Generating data at scale factor $SCALE."
(cd tpcds-gen; hadoop jar target/*.jar -d ${DIR}/${SCALE}/ -s ${SCALE})
fi
- 创建数据库和加载 hdfs 的数据文件:脚本会在 Hive 中创建一个数据库和对应的表,并加载 hdfs 的数据文件。
# 在脚本tpcds-setup.sh 中
# 脚本ddl-tpcds/text/alltables.sql 创建了 hive表
runcommand "$HIVE -i settings/load-flat.sql -f ddl-tpcds/text/alltables.sql --hivevar DB=tpcds_text_${SCALE} --hivevar LOCATION=${DIR}/${SCALE}"
#在ddl-tpcds/text/alltables.sql中
drop table if exists store_sales;
create external table if not exists store_sales(
ss_sold_date_sk bigint
, ss_sold_time_sk bigint
, ss_item_sk bigint
, ss_customer_sk bigint
, ss_cdemo_sk bigint
, ss_hdemo_sk bigint
, ss_addr_sk bigint
, ss_store_sk bigint
, ss_promo_sk bigint
, ss_ticket_number bigint
, ss_quantity int
, ss_wholesale_cost decimal(7,2)
, ss_list_price decimal(7,2)
, ss_sales_price decimal(7,2)
, ss_ext_discount_amt decimal(7,2)
, ss_ext_sales_price decimal(7,2)
, ss_ext_wholesale_cost decimal(7,2)
, ss_ext_list_price decimal(7,2)
, ss_ext_tax decimal(7,2)
, ss_coupon_amt decimal(7,2)
, ss_net_paid decimal(7,2)
, ss_net_paid_inc_tax decimal(7,2)
, ss_net_profit decimal(7,2)
)
row format delimited fields terminated by '|'
location '${LOCATION}/store_sales'
;
# `location '${LOCATION}/store_sales'`指定了外部表的存储位置。`${LOCATION}`为${DIR}/${SCALE}即/tmp/tpcds-generate/10
# row format delimited fields terminated by '|'表示文件中每行的以'|'字符作为分隔符,即每行的数据对应着表中的字段
④ 转换表为 ORC 格式:脚本会使用 Hive 的 INSERT OVERWRITE TABLE
命令将原始数据表转换为 ORC 格式的数据表。这个过程会创建新的表,并将数据以 ORC 格式写入其中。下面以 ORC 格式和 10GB 数据量为例。
# 在脚本tpcds-setup.sh 中
# 创建新的数据库tpcds_bin_partitioned_${FORMAT}_${SCALE},即 tpcds_bin_partitioned_orc_10,还有目录 ddl-tpcds 下的全部 25 张表
# 省略 ...
DIMS="date_dim time_dim item customer customer_demographics household_demographics customer_address store promotion warehouse ship_mode reason income_band call_center web_page catalog_page web_site"
FACTS="store_sales store_returns web_sales web_returns catalog_sales catalog_returns inventory"
# 省略 ...
DATABASE=tpcds_bin_partitioned_${FORMAT}_${SCALE}
# 省略 ...
for t in ${DIMS}
do
COMMAND="$HIVE -i settings/load-partitioned.sql -f ddl-tpcds/bin_partitioned/${t}.sql \
--hivevar DB=${DATABASE} --hivevar SOURCE=tpcds_text_${SCALE} \
--hivevar SCALE=${SCALE} \
--hivevar REDUCERS=${REDUCERS} \
--hivevar FILE=${FORMAT}"
echo -e "${t}:\n\t@$COMMAND $SILENCE && echo 'Optimizing table $t ($i/$total).'" >> $LOAD_FILE
i=`expr $i + 1`
done
for t in ${FACTS}
do
COMMAND="$HIVE -i settings/load-partitioned.sql -f ddl-tpcds/bin_partitioned/${t}.sql \
--hivevar DB=${DATABASE} \
--hivevar SCALE=${SCALE} \
--hivevar SOURCE=tpcds_text_${SCALE} --hivevar BUCKETS=${BUCKETS} \
--hivevar RETURN_BUCKETS=${RETURN_BUCKETS} --hivevar REDUCERS=${REDUCERS} --hivevar FILE=${FORMAT}"
echo -e "${t}:\n\t@$COMMAND $SILENCE && echo 'Optimizing table $t ($i/$total).'" >> $LOAD_FILE
i=`expr $i + 1`
done
# 以目录 ddl-tpcds/bin_partitioned/store_sales.sql 为例,分析一下 hive sql
# 创建数据库,其中指定格式为 FILE
create database if not exists ${DB};
use ${DB};
drop table if exists store_sales;
# 创建表 store_sales
create table store_sales
(
ss_sold_time_sk bigint
, ss_item_sk bigint
, ss_customer_sk bigint
, ss_cdemo_sk bigint
, ss_hdemo_sk bigint
, ss_addr_sk bigint
, ss_store_sk bigint
, ss_promo_sk bigint
, ss_ticket_number bigint
, ss_quantity int
, ss_wholesale_cost decimal(7,2)
, ss_list_price decimal(7,2)
, ss_sales_price decimal(7,2)
, ss_ext_discount_amt decimal(7,2)
, ss_ext_sales_price decimal(7,2)
, ss_ext_wholesale_cost decimal(7,2)
, ss_ext_list_price decimal(7,2)
, ss_ext_tax decimal(7,2)
, ss_coupon_amt decimal(7,2)
, ss_net_paid decimal(7,2)
, ss_net_paid_inc_tax decimal(7,2)
, ss_net_profit decimal(7,2)
)
partitioned by (ss_sold_date_sk bigint)
stored as ${FILE};
# 从表为 ${SOURCE}.store_sales 即数据格式为 txt 的 tpcds_text_${SCALE} .store_sales,即 tpcds_text_10.store_sales,导入新数据库的 store_sales
from ${SOURCE}.store_sales ss
insert overwrite table store_sales partition (ss_sold_date_sk)
select
ss.ss_sold_time_sk,
ss.ss_item_sk,
ss.ss_customer_sk,
ss.ss_cdemo_sk,
ss.ss_hdemo_sk,
ss.ss_addr_sk,
ss.ss_store_sk,
ss.ss_promo_sk,
ss.ss_ticket_number,
ss.ss_quantity,
ss.ss_wholesale_cost,
ss.ss_list_price,
ss.ss_sales_price,
ss.ss_ext_discount_amt,
ss.ss_ext_sales_price,
ss.ss_ext_wholesale_cost,
ss.ss_ext_list_price,
ss.ss_ext_tax,
ss.ss_coupon_amt,
ss.ss_net_paid,
ss.ss_net_paid_inc_tax,
ss.ss_net_profit,
ss.ss_sold_date_sk
where ss.ss_sold_date_sk is not null
insert overwrite table store_sales partition (ss_sold_date_sk)
select
ss.ss_sold_time_sk,
ss.ss_item_sk,
ss.ss_customer_sk,
ss.ss_cdemo_sk,
ss.ss_hdemo_sk,
ss.ss_addr_sk,
ss.ss_store_sk,
ss.ss_promo_sk,
ss.ss_ticket_number,
ss.ss_quantity,
ss.ss_wholesale_cost,
ss.ss_list_price,
ss.ss_sales_price,
ss.ss_ext_discount_amt,
ss.ss_ext_sales_price,
ss.ss_ext_wholesale_cost,
ss.ss_ext_list_price,
ss.ss_ext_tax,
ss.ss_coupon_amt,
ss.ss_net_paid,
ss.ss_net_paid_inc_tax,
ss.ss_net_profit,
ss.ss_sold_date_sk
where ss.ss_sold_date_sk is null
sort by ss.ss_sold_date_sk
;
⑤ 收集统计信息:脚本会使用 Hive 的 ANALYZE TABLE
命令收集表的统计信息,以帮助优化查询计划。
# 利用 hive cli执行 /ddl-tpcds/text/analyze_everything.sql
hive>USE tpcds_bin_partitioned_orc_10;
hive>SOURCE /ddl-tpcds/text/analyze_everything.sql;
网友评论