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 操作都支援,因此透過使用 Beam SQL 轉換執行,成功通過了 103 個 SQL 查詢 (99 + 4) 中的 28 個。

目前(截至 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 擴充功能只能在批次模式下執行,目前支援這些執行器(尚未測試其他執行器)

基準測試啟動組態

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 (local) 上針對 1GB Parquet 格式的資料集執行 Query3 套件

./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 (local) 上針對 10GB CSV 格式的資料集平行執行 Query7 和 Query10 套件

./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 上針對 100GB PARQUET 格式的資料集執行所有查詢的套件

./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"