TPC Benchmark™ DS (TPC-DS) 基准测试套件

什么是

来自 TPC-DS 规范文档

“TPC-DS 是一个决策支持基准测试,它模拟决策支持系统的几个普遍适用的方面,包括查询和数据维护。该基准测试提供对通用决策支持系统性能的代表性评估。”

一般而言,TPC-DS 是

表架构

架构概述

来自 TPC-DS 规范文档

TPC-DS 架构模拟了采用三种主要销售渠道(商店、目录和互联网)的组织的销售和销售退货流程。该架构包含七个事实表

  • 一对事实表,重点关注三个渠道中每个渠道的产品销售和退货
  • 一个事实表,模拟目录和互联网销售渠道的库存。

此外,该架构还包含 17 个维度表,这些维度表与所有销售渠道相关联。

查询

TPC-DS 基准测试包含 99 个不同的 SQL-99 查询(包括 OLAP 扩展)。每个查询都回答一个业务问题,这说明了查询可能使用的业务环境。

所有查询都使用随机输入参数进行“模板化”,用于比较 SQL 实现的完整性和性能。

输入数据

输入数据源

Beam 中的 TPC-DS 扩展

Beam 提供了 TPC-DS 基准测试的 简化实现

原因

在 Beam 中拥有 TPC-DS 基准测试有几个原因

查询

所有 Beam 中的 TPC-DS 查询都是预先生成的,并存储在提供的工件中。

目前,由于并非所有 SQL-99 操作都受支持,因此 28 个 SQL 查询(99 + 4)中的 103 个通过使用 Beam SQL 变换运行成功通过。

目前(截至 Beam 2.40.0 版本)支持的查询是

所有 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 模式下运行,目前支持这些运行器(未在其他运行器上测试)

基准测试启动配置

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"