TPC Benchmark™ DS (TPC-DS) ベンチマークスイート
概要
TPC-DS 仕様書より
「TPC-DSは、クエリやデータメンテナンスなど、意思決定支援システムのいくつかの一般的な側面をモデル化した意思決定支援ベンチマークです。このベンチマークは、汎用意思決定支援システムとしての性能の代表的な評価を提供します。」
一般的に、TPC-DSは
- 業界標準ベンチマーク (OLAP/データウェアハウス);
- 多くの分析処理システム - RDBMS、Apache Spark、Apache Flinkなど - に実装されています;
- 幅広い種類のクエリ (SQL) を提供します;
- さまざまなサイズの入力データを生成するためのツールを組み込んでいます.
テーブルスキーマ
スキーマの概要
TPC-DS 仕様書より
TPC-DSスキーマは、店舗、カタログ、インターネットの3つの主要な販売チャネルを使用する組織の売上と返品プロセスをモデル化しています。スキーマには、7つのファクトテーブルが含まれています
- 3つのチャネルそれぞれの製品の売上と返品に焦点を当てたファクトテーブルのペア
- カタログとインターネットの販売チャネルの在庫をモデル化した単一のファクトテーブル.
さらに、スキーマには、すべての販売チャネルに関連付けられた17のディメンションテーブルが含まれています.
テーブル
- store_sales - 各行は、店舗チャネルを通じて行われた売上の単一の明細を表し、store_salesファクトテーブルに記録されます
- store_returns - 各行は、店舗チャネルを通じて販売された商品の返品に関する単一の明細を表し、store_returnsファクトテーブルに記録されます.
- catalog_sales - 各行は、カタログチャネルを通じて行われた売上の単一の明細を表し、catalog_salesファクトテーブルに記録されます.
- catalog_returns - 各行は、カタログチャネルを通じて販売された商品の返品に関する単一の明細を表し、catalog_returnsテーブルに記録されます.
- web_sales - 各行は、Webチャネルを通じて行われた売上の単一の明細を表し、web_salesファクトテーブルに記録されます.
- web_returns - 各行は、Web販売チャネルを通じて販売された商品の返品に関する単一の明細を表し、web_returnsテーブルに記録されます.
- inventory - 各行は、特定の週に特定の倉庫にある特定の商品の在庫数量を表します.
- store - 各行は、店舗の詳細を表します.
- call_center - 各行は、コールセンターの詳細を表します.
- catalog_page - 各行は、カタログページの詳細を表します.
- web_site - 各行は、Webサイトの詳細を表します.
- web_page - 各行は、Webサイト内のWebページの詳細を表します.
- warehouse - 各行は、商品が在庫されている倉庫を表します.
- customer - 各行は、顧客を表します.
- customer_address - 各行は、一意の顧客住所を表します (各顧客は複数の住所を持つことができます).
- customer_demographics - customer demographicsテーブルには、顧客の属性情報の各一意の組み合わせごとに1行が含まれています.
- date_dim - 各行は、1暦日を表します。特定の行のサロゲートキー (d_date_sk) は、その行で記述されているユリウス日から派生します.
- household_demographics - 各行は、世帯の属性プロファイルを定義します.
- item - 各行は、一意の製品構成 (例: サイズ、色、メーカーなど) を表します.
- income_band - 各行は、所得範囲の詳細を表します.
- promotion - 各行は、特定の製品プロモーション (例: 広告、販売、PR) の詳細を表します.
- reason - 各行は、商品が返品された理由を表します.
- ship_mode - 各行は、配送モードを表します.
- time_dim - 各行は、1秒を表します.
クエリ
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操作がサポートされているわけではないため、103個のSQLクエリ (99 + 4) のうち28個が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拡張機能は、**バッチ**モードでのみ実行でき、現時点では次のランナーをサポートしています (他のランナーではテストされていません)
- Spark Runner
- Flink Runner
- Dataflow Runner
ベンチマーク起動設定
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"