CodeWalk

大数据集群性能基准测试(Benchmark)方法:TPC-DS/TPC-H

作者:我是大山 · 2026-05-30 12:55

在大数据平台上线或升级后,如何进行性能基准测试?请解释TPC-DS和TPC-H两种标准测试集的区别、测试数据集生成方法(dsdgen/dbgen)、关键性能指标(查询响应时间/吞吐量/资源利用率)、以及如何解读测试结果进行性能对比。给出一个在Spark/Hive上运行TPC-DS测试的完整流程示例。

回答

我是大山

大数据基准测试(TPC-DS/TPC-H):

1. TPC-DS vs TPC-H: | 特性 | TPC-DS | TPC-H | |------|--------|-------| | 场景 | 决策支持系统 | Oracle/DB2时代标准 | | 表数 | 24张表(7事实+17维度)| 8张表 | | 查询数 | 99个复杂的SQL | 22个SQL | | 数据倾斜 | ✅ 模拟真实业务倾斜 | ❌ 均匀分布 | | SQL复杂度 | 高(多层子查询/Windowing/ROLLUP)| 中等 | | 适用 | 现代OLAP引擎(Spark/Flink/ClickHouse)| 传统数据库 |

2. 数据生成

# TPC-DS数据生成
# 下载tpcds-kit
wget https://github.com/databricks/tpcds-kit/archive/refs/tags/v1.8.0.tar.gz
cd tpcds-kit/tools

# 生成100GB数据(Scale Factor=100)
./dsdgen -SCALE 100 -DIR /data/tpcds_100g -PARALLEL 8

# TPC-H数据生成
./dbgen -s 100 -T a -f -q  # 100GB

3. Spark上运行TPC-DS测试

# 1. 加载数据到Hive
spark-sql -f tpcds_ddl.sql  # 建表DDL

# 2. 导入数据
for tbl in $(cat tables.txt); do
  spark-sql -e "
    LOAD DATA LOCAL INPATH '/data/tpcds_100g/$tbl/' 
    OVERWRITE INTO TABLE tpcds.$tbl;"
done

# 3. 收集统计信息
spark-sql -e "ANALYZE TABLES IN tpcds COMPUTE STATISTICS;"

# 4. 执行99个查询
for q in $(seq 1 99); do
  start=$(date +%s%N)
  spark-sql -f "tpcds_queries/query$q.sql" > /dev/null
  end=$(date +%s%N)
  echo "Query $q: $(((end-start)/1000000))ms" >> result.log
done

# 5. 计算总耗时和平均耗时

4. 关键性能指标: | 指标 | 说明 | |------|------| | Power@Size | 单个用户串行执行99个查询的总时间 | | Throughput@Size | 多用户并发执行吞吐量 | | QphDS@Size | 综合性能评分 | | 资源利用率 | CPU/内存/IO/网络峰值 | | 查询失败率 | OOM/超时等失败查询数 |

5. 测试注意事项

  • 预热(Warm Cache)后测试2~3次取平均
  • 记录Spark/Flink配置和集群规模
  • 关注长尾Query(最慢的几个查询分析瓶颈)
  • 使用spark.sql.adaptive.enabled等优化配置
  • 对比不同引擎(Spark SQL vs Trino vs ClickHouse)