TPC Benchmark™ DS (TPC-DS) ベンチマークスイート

概要

TPC-DS 仕様書より

「TPC-DSは、クエリやデータメンテナンスなど、意思決定支援システムのいくつかの一般的な側面をモデル化した意思決定支援ベンチマークです。このベンチマークは、汎用意思決定支援システムとしての性能の代表的な評価を提供します。」

一般的に、TPC-DSは

テーブルスキーマ

スキーマの概要

TPC-DS 仕様書より

TPC-DSスキーマは、店舗、カタログ、インターネットの3つの主要な販売チャネルを使用する組織の売上と返品プロセスをモデル化しています。スキーマには、7つのファクトテーブルが含まれています

  • 3つのチャネルそれぞれの製品の売上と返品に焦点を当てたファクトテーブルのペア
  • カタログとインターネットの販売チャネルの在庫をモデル化した単一のファクトテーブル.

さらに、スキーマには、すべての販売チャネルに関連付けられた17のディメンションテーブルが含まれています.

テーブル

クエリ

TPC-DSベンチマークには、99の異なるSQL-99クエリ (OLAP拡張を含む) が含まれています. 各クエリはビジネス上の質問に答え、クエリが使用される可能性のあるビジネスコンテキストを示しています.

すべてのクエリは、ランダムな入力パラメータで「テンプレート化」され、SQL実装の完全性とパフォーマンスを比較するために使用されます.

入力データ

入力データソース

BeamにおけるTPC-DS拡張

Beamは、TPC-DSベンチマークの簡略化された実装を提供しています.

理由

BeamにTPC-DSベンチマークを用意するには、いくつかの理由があります

クエリ

BeamのすべてのTPC-DSクエリは事前に生成され、提供されるアーティファクトに保存されます.

現時点では、すべてのSQL-99操作がサポートされているわけではないため、103個のSQLクエリ (99 + 4) のうち28個が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拡張機能は、**バッチ**モードでのみ実行でき、現時点では次のランナーをサポートしています (他のランナーではテストされていません)

ベンチマーク起動設定

TPC-DSランチャーは、コマンドライン引数の管理にBeam PipelineOptionsを使用するプログラムと同様に、`--runner` 引数を受け入れます。これに加えて、必要な依存関係を設定する必要があります.

Gradle経由で実行する場合、次の2つのパラメータが実行を制御します

-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(ローカル)で、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(ローカル)で、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"