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