TPC Benchmark™ DS (TPC-DS) 基准测试套件
什么是
来自 TPC-DS 规范文档
“TPC-DS 是一个决策支持基准测试,它模拟决策支持系统的几个普遍适用的方面,包括查询和数据维护。该基准测试提供对通用决策支持系统性能的代表性评估。”
一般而言,TPC-DS 是
- 行业标准基准测试(OLAP/数据仓库);
- 已在许多分析处理系统中实现 - RDBMS、Apache Spark、Apache Flink 等;
- 它提供范围广泛的不同查询(SQL);
- 它包含用于生成不同规模的输入数据的工具。
表架构
架构概述
来自 TPC-DS 规范文档
TPC-DS 架构模拟了采用三种主要销售渠道(商店、目录和互联网)的组织的销售和销售退货流程。该架构包含七个事实表
- 一对事实表,重点关注三个渠道中每个渠道的产品销售和退货
- 一个事实表,模拟目录和互联网销售渠道的库存。
此外,该架构还包含 17 个维度表,这些维度表与所有销售渠道相关联。
表
- store_sales - 每行代表通过商店渠道进行的销售的单行项目,并记录在 store_sales 事实表中
- store_returns - 每行代表通过商店渠道销售的商品的退货的单行项目,并记录在 store_returns 事实表中。
- catalog_sales - 每行代表通过目录渠道进行的销售的单行项目,并记录在 catalog_sales 事实表中。
- catalog_returns - 每行代表通过目录渠道销售的商品的退货的单行项目,并记录在 catalog_returns 表中。
- web_sales - 每行代表通过网络渠道进行的销售的单行项目,并记录在 web_sales 事实表中。
- web_returns - 每行代表通过网络销售渠道销售的商品的退货的单行项目,并记录在 web_returns 表中。
- inventory - 每行代表特定时间段内特定仓库中特定商品的库存数量。
- store - 每行代表商店的详细信息。
- call_center - 每行代表呼叫中心的详细信息。
- catalog_page - 每行代表目录页面的详细信息。
- web_site - 每行代表网站的详细信息。
- web_page - 每行代表网站内的网页的详细信息。
- warehouse - 每行代表存放商品的仓库。
- customer - 每行代表客户。
- customer_address - 每行代表唯一的客户地址(每个客户可以拥有多个地址)。
- customer_demographics - 客户人口统计表包含每种独特的客户人口统计信息组合的一行。
- date_dim - 每行代表一个日历日。给定行的代理键 (d_date_sk) 源自该行所描述的儒略日期。
- household_demographics - 每行定义家庭人口统计概要文件。
- item - 每行代表唯一的产品配方(例如,尺寸、颜色、制造商等)。
- income_band - 每行代表收入范围的详细信息。
- promotion - 每行代表特定产品促销的详细信息(例如,广告、销售、公关)。
- reason - 每行代表商品退货的原因。
- ship_mode - 每行代表运输方式。
- time_dim - 每行代表一秒钟。
查询
TPC-DS 基准测试包含 99 个不同的 SQL-99 查询(包括 OLAP 扩展)。每个查询都回答一个业务问题,这说明了查询可能使用的业务环境。
所有查询都使用随机输入参数进行“模板化”,用于比较 SQL 实现的完整性和性能。
输入数据
输入数据源
- 输入文件(CSV)使用 CLI 工具
dsdgen
生成 - 可以为不同的规模因子大小生成输入数据集
- 1GB / 10GB / 100GB / 1000GB
- 该工具将生成数据的最小量限制为 1GB
Beam 中的 TPC-DS 扩展
Beam 提供了 TPC-DS 基准测试的 简化实现。
原因
在 Beam 中拥有 TPC-DS 基准测试有几个原因
- 将 Beam SQL 的性能与不同运行器针对原生 SQL 实现的性能进行比较;
- 在不同的运行时环境中使用 Beam SQL;
- 识别缺少或不正确的 Beam SQL 功能;
- 识别 Beam 和 Beam SQL 中的性能问题。
查询
所有 Beam 中的 TPC-DS 查询都是预先生成的,并存储在提供的工件中。
目前,由于并非所有 SQL-99 操作都受支持,因此 28 个 SQL 查询(99 + 4)中的 103 个通过使用 Beam SQL 变换运行成功通过。
目前(截至 Beam 2.40.0 版本)支持的查询是
- 3, 7, 10, 22, 25, 26, 29, 35, 38, 40, 42, 43, 50, 52, 55, 69, 78, 79, 83, 84, 87, 93, 96, 97, 99
表
所有 TPC-DS 表架构都存储在提供的工件中。
输入数据
CSV 和 Parquet 输入数据已预先生成,并放置在 Google Cloud Storage 存储桶 gs://beam-tpcds
中。
CSV 数据集
放置在 gs://beam-tpcds/datasets/text/*
存储桶中,按不同的数据规模因子进行分布。
Parquet 数据集
放置在 gs://beam-tpcds/datasets/parquet/nonpartitioned/
和 gs://beam-tpcds/datasets/parquet/partitioned/
中,按不同的数据规模因子进行分布。
对于 partitioned
版本,一些大型表已根据日期列预先分区,分为存储桶中的多个文件。
运行时
Beam 的 TPC-DS 扩展只能在 Batch 模式下运行,目前支持这些运行器(未在其他运行器上测试)
- Spark 运行器
- Flink 运行器
- Dataflow 运行器
基准测试启动配置
TPC-DS 启动器接受 --runner
参数,就像使用 Beam PipelineOptions 来管理其命令行参数的程序一样。除此之外,还需要配置必要的依赖项。
通过 Gradle 运行时,以下两个参数控制执行
-P tpcds.args
The command line to pass to the TPC-DS main program.
-P tpcds.runner
The Gradle project name of the runner, such as ":runners:spark:3" or
":runners:flink:1.17. The project names can be found in the root
`settings.gradle.kts`.
在运行套件之前,必须生成测试数据并将其存储到可访问的文件系统中。查询结果将写入输出文件。
常见配置参数
输入数据集的规模因子大小(1GB / 10GB / 100GB / 1000GB)
--dataSize=<1GB|10GB|100GB|1000GB>
输入数据集目录的路径
--dataDirectory=<path to dir>
结果目录的路径
--resultsDirectory=<path to dir>
输入文件的格式
--sourceType=<CSV|PARQUET>
选择要运行的查询(以逗号分隔的查询编号列表或 all
表示所有查询)
--queries=<1,2,...N|all>
并行运行的查询数量 N
--tpcParallel=N
运行 TPC-DS
以下是一些示例,演示如何在不同的运行器上运行 TPC-DS 基准测试。
在 SparkRunner(本地)上使用 Query3 针对 Parquet 格式的 1Gb 数据集运行套件
./gradlew :sdks:java:testing:tpcds:run \
-Ptpcds.runner=":runners:spark:3" \
-Ptpcds.args="
--runner=SparkRunner
--dataSize=1GB
--sourceType=PARQUET
--dataDirectory=gs://beam-tpcds/datasets/parquet/partitioned
--resultsDirectory=/tmp/beam-tpcds/results/spark/
--tpcParallel=1
--queries=3"
在 FlinkRunner(本地)上使用 Query7 和 Query10 并行针对 CSV 格式的 10Gb 数据集运行套件
./gradlew :sdks:java:testing:tpcds:run \
-Ptpcds.runner=":runners:flink:1.13" \
-Ptpcds.args="
--runner=FlinkRunner
--parallelism=2
--dataSize=10GB
--sourceType=CSV
--dataDirectory=gs://beam-tpcds/datasets/csv
--resultsDirectory=/tmp/beam-tpcds/results/flink/
--tpcParallel=2
--queries=7,10"
在 DataflowRunner 上使用所有查询针对 PARQUET 格式的 100GB 数据集运行套件
./gradlew :sdks:java:testing:tpcds:run \
-Ptpcds.runner=":runners:google-cloud-dataflow-java" \
-Ptpcds.args="
--runner=DataflowRunner
--region=<region_name>
--project=<project_name>
--numWorkers=4
--maxNumWorkers=4
--autoscalingAlgorithm=NONE
--dataSize=100GB
--sourceType=PARQUET
--dataDirectory=gs://beam-tpcds/datasets/parquet/partitioned
--resultsDirectory=/tmp/beam-tpcds/results/dataflow/
--tpcParallel=4
--queries=all"