Workload 压力测试,包括 Spark/Flink 相关任务的测试。

TPC-DC Benchmark

TPC-DS1 由第三方社区创建和维护,是事实上的做性能压测,协助确定解决方案的工业标准。这个测试集包含对大数据集的统计、报表生成、联机查询、数据挖掘等复杂应用,测试用的数据和值是有倾斜的,与真实数据一致。可以说 TPC-DS 是与真实场景非常接近的一个测试集,也是难度较大的一个测试集。

TPC-DS 包含 104 个query,覆盖了 SQL 2003 的大部分标准,有 99 条压测query,其中的4条query各有2个变体(14,23,24,39),最后还有一个 s_max query进行全量扫描和最大的一些表的聚合。

这个基准测试有以下几个主要特点:

  • 遵循SQL 2003的语法标准,SQL案例比较复杂;
  • 分析的数据量大,并且测试案例是在回答真实的商业问题;
  • 测试案例中包含各种业务模型(如分析报告型,迭代式的联机分析型,数据挖掘型等);
  • 几乎所有的测试案例都有很高的IO负载和CPU计算需求。

测试步骤

环境准备

  • Create EKS Cluster
  • Create S3 Bucket
  • Install Spark Operator
  • Install Spark History Server
  • Install Alluxio

数据生成

通过执行 DataGeneration.scala 来生成数据,并存储在 S3 上,后面的 Spark SQL 查询任务会用到这些数据。

1
2
3
4
5
apiVersion: "sparkoperator.k8s.io/v1beta2"  
kind: SparkApplication  
metadata:  
  name: tpcds-benchmark-data-generation-1g  namespace: defaultspec:  
  type: Scala  image: seedjeffwan/spark:v2.4.5-examples  sparkVersion: 2.4.5  mainClass: com.amazonaws.eks.tpcds.DataGeneration  mainApplicationFile: local:///opt/spark/examples/jars/eks-spark-benchmark-assembly-1.0.jar  mode: cluster  arguments:  # TPC-DS data localtion    - "s3a://spark-k8s-data/TPCDS-TEST-1G"  # Path to kit in the docker image    - "/opt/tpcds-kit/tools"  # Data Format    - "parquet"  # Scale factor (in GB)    - "1"  # Generate data num partitions    - "100"  # Create the partitioned fact tables    - "false"  # Shuffle to get partitions coalesced into single files.    - "false"  # Logging set to WARN    - "true"  sparkConf:    "spark.speculation": "false"    "spark.network.timeout": "2400"    # S3 Credential    "spark.hadoop.fs.s3a.aws.credentials.provider": "com.amazonaws.auth.InstanceProfileCredentialsProvider"    # S3 Configs    "spark.hadoop.fs.s3a.connection.timeout": "1200000"    "spark.hadoop.fs.s3a.path.style.access": "true"    "spark.hadoop.fs.s3a.connection.maximum": "200"    "spark.hadoop.fs.s3a.fast.upload": "true"    "spark.hadoop.fs.s3a.readahead.range": "256K"    "spark.hadoop.fs.s3a.input.fadvise": "random"    # S3A Committer    "spark.hadoop.mapreduce.outputcommitter.factory.scheme.s3a": "org.apache.hadoop.fs.s3a.commit.S3ACommitterFactory"    # "spark.sql.sources.commitProtocolClass": "org.apache.spark.internal.io.cloud.PathOutputCommitProtocol"    # "spark.sql.parquet.output.committer.class": "org.apache.hadoop.mapreduce.lib.output.BindingPathOutputCommitter"    "spark.hadoop.fs.s3a.committer.name": "directory"    "spark.hadoop.fs.s3a.committer.staging.conflict-mode": "append"  driver:    cores: 2    coreLimit: "2048m"    memory: "8000m"    serviceAccount: spark  executor:    instances: 3    cores: 1    memory: "8000m"    memoryOverhead: 2g  restartPolicy:    type: Never  

Reference