3. Spark 环境搭建与配置

在量化回测场景中,Spark 集群的部署模式与参数配置直接决定了回测任务的执行效率与资源利用率。本章将系统讲解三种主流部署模式的核心差异,并给出面向回测计算的最佳配置实践。

3.1 Spark 集群部署模式对比

Spark 支持 Standalone、YARN 和 Kubernetes(K8s)三种集群管理模式。下表从资源管理、弹性扩缩、运维复杂度三个维度进行对比:

特性 Standalone YARN Kubernetes
资源管理 Spark 内置 Master/Worker Hadoop YARN ResourceManager K8s Scheduler + 自定义调度器
弹性扩缩 手动配置 Worker 数量 动态资源分配(需开启) 原生 Pod 水平扩缩(HPA)
运维复杂度 低,适合开发测试 中,需 Hadoop 生态 高,需容器化与 K8s 运维
回测适用场景 单机/小规模回测 企业级批处理回测 云原生弹性回测
推荐选择:对于量化团队,若已有 Hadoop 集群优先选 YARN;若从零搭建且追求云原生弹性,选 K8s;Standalone 仅用于本地开发与快速验证。

3.2 部署模式架构图

下图展示了三种部署模式下 Spark 应用与资源管理器的交互关系:

Spark 集群部署模式对比架构 Standalone Master(资源调度) Worker 1 Worker 2 Worker N 手动配置 Worker 数量 无外部依赖 YARN ResourceManager NodeManager 1 NodeManager 2 NodeManager N 动态资源分配 需 Hadoop 生态 Kubernetes K8s Scheduler Pod (Driver) Pod (Executor 1) Pod (Executor N) 原生容器化 HPA 弹性扩缩

3.3 Spark 配置参数调优

回测计算对内存和并行度高度敏感。以下参数是调优的核心:

3.3.1 Executor 内存配置

参数名 推荐值(回测场景) 说明
spark.executor.memory 4g – 8g 每个 Executor 的 JVM 堆内存,回测数据量大时建议 8g
spark.executor.memoryOverhead 1g – 2g 堆外内存(用于 JVM 内部开销、向量化计算等)
spark.driver.memory 2g – 4g Driver 端内存,回测结果聚合时需适当提高
spark.memory.offHeap.enabled true 开启堆外内存,减少 GC 压力
spark.memory.offHeap.size 2g 堆外内存大小,需与 overhead 配合调整
内存调优原则:回测中每个 Executor 处理的分区数据量建议控制在 200MB – 500MB 之间。若单个分区超过 1GB,应增加分区数或提高 Executor 内存。

3.3.2 并行度配置

参数名 推荐值(回测场景) 说明
spark.default.parallelism Executor 核心数 × 2~3 控制 RDD/DataFrame 默认分区数,回测建议 200 – 500
spark.sql.shuffle.partitions 200 – 400 SQL 聚合、join 时的分区数,回测中避免过大导致小文件
spark.executor.cores 2 – 4 每个 Executor 的 CPU 核心数,回测计算密集型建议 4
spark.task.cpus 1 每个任务分配的 CPU 数,回测中保持默认
常见误区:并行度并非越大越好。过高的并行度会导致任务调度开销剧增、小文件过多、Shuffle 网络压力增大。建议通过 spark.sql.adaptive.enabled=true 开启自适应查询执行,让 Spark 自动调整分区。

3.4 回测场景参数调优流程

以下步骤适用于量化回测任务的参数调优:

  1. 评估数据规模:统计回测数据总大小(如 500GB 日频行情数据)。
  2. 确定 Executor 数量:总数据量 ÷ 每个 Executor 处理量(建议 200MB – 500MB),得到 Executor 数。
  3. 配置内存:按 3.3.1 表格设置 executor.memory 和 overhead。
  4. 设置并行度:spark.default.parallelism = Executor 数 × 核心数 × 2。
  5. 开启自适应执行:设置 spark.sql.adaptive.enabled=true 和 spark.sql.adaptive.coalescePartitions.enabled=true。
  6. 测试与迭代:运行小规模回测,观察 Spark UI 中 Stage 耗时、GC 时间、Shuffle 读写量,逐步调整。

3.5 参数配置示例

以下是一个面向 1TB 回测数据、10 节点集群的配置示例:

# 提交回测任务时的配置
spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --num-executors 20 \
  --executor-cores 4 \
  --executor-memory 8g \
  --conf spark.executor.memoryOverhead=2g \
  --conf spark.driver.memory=4g \
  --conf spark.default.parallelism=400 \
  --conf spark.sql.shuffle.partitions=300 \
  --conf spark.sql.adaptive.enabled=true \
  --conf spark.sql.adaptive.coalescePartitions.enabled=true \
  --conf spark.memory.offHeap.enabled=true \
  --conf spark.memory.offHeap.size=2g \
  --class com.quant.backtest.Main \
  backtest-app.jar
生产建议:在 YARN 模式下,建议开启 spark.dynamicAllocation.enabled=true,让 Spark 根据任务负载自动调整 Executor 数量,避免资源浪费。

3.6 部署模式选择决策流程

下图帮助量化团队快速选择适合的部署模式:

部署模式选择决策流程 回测任务需求评估 已有 Hadoop 集群? YARN 模式 利用现有资源管理 适合批处理回测 K8s 或 Standalone 云原生选 K8s 开发测试选 Standalone 是 否

3.7 本章小结

  • 部署模式:Standalone 适合开发测试,YARN 适合企业批处理,K8s 适合云原生弹性场景。
  • 内存调优:Executor 内存建议 4g – 8g,配合堆外内存减少 GC;Driver 内存根据结果聚合量调整。
  • 并行度调优:默认并行度设为 Executor 核心数 × 2~3,SQL Shuffle 分区控制在 200 – 400。
  • 自适应执行:开启 spark.sql.adaptive.enabled 让 Spark 自动优化分区,减少手动调优成本。
  • 生产建议:YARN 下开启动态资源分配,K8s 下使用 HPA 实现弹性扩缩。