CodeWalk

Spark on Kubernetes部署与资源管理

作者:孤独的心 · 2026-05-30 12:55

请介绍Spark on Kubernetes的部署架构、资源管理方式以及与YARN模式的对比。

回答

孤独的心

Spark on K8s:Spark 2.3+支持原生Kubernetes调度,取代传统的YARN/Mesos。

一、架构:

            Kubernetes API Server
                   │
         ┌─────────┴─────────┐
         │   Driver Pod      │
         │   Spark Driver    │
         └─────────┬─────────┘
                   │
         ┌─────────┴─────────┐
         │   Executor Pods   │
         │  Executor 1..N    │
         └───────────────────┘

二、部署模式:

1. Cluster模式(推荐):

./bin/spark-submit \
  --master k8s://https://<k8s-apiserver>:6443 \
  --deploy-mode cluster \
  --conf spark.kubernetes.container.image=spark:3.4 \
  --conf spark.kubernetes.nameset=spark-jobs \
  --conf spark.kubernetes.driver.limit.cores=2 \
  --conf spark.kubernetes.executor.request.cores=1 \
  --conf spark.kubernetes.executor.limit.memory=4g \
  --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
  local:///opt/spark/jobs/myjob.py

2. Client模式:

  • Driver运行在Client机器上(非Pod)
  • 适合调试

三、资源管理方式:

资源K8s方式
CPUspark.kubernetes.{driver|executor}.{request|limit}.cores
内存spark.{driver|executor}.memory + spark.{driver|executor}.memoryOverhead
GPUspark.kubernetes.executor.limit.cores=gpu
存储PVC(持久卷声明)或emptyDir
动态扩展Cluster Autoscaler自动扩缩Node

四、优势与挑战:

优势:

  1. 弹性伸缩:K8s Cluster Autoscaler自动扩缩Node
  2. 资源隔离:每个Job在独立Pod中运行
  3. 统一资源管理:与微服务共享集群
  4. 快速启动:Pod启动秒级(对比YARN Container分钟级)
  5. 日志集成:对接K8s日志系统(EFK/Loki)

挑战:

  1. 网络瓶颈:Shuffle网络IO为瓶颈(需优化网络插件)
  2. 本地性降低:Pod可能调度到无数据的Node
  3. 存储集成:需配置PVC或OSS(HDFS需额外部署)
  4. 监控复杂:需额外配置Prometheus/Grafana

五、YARN vs K8s对比: | 维度 | YARN | K8s | |------|------|-----| | 启动速度 | 较慢(分钟级) | 快(秒级)| | 资源隔离 | Container | Pod + cgroup | | 扩展性 | 有限 | 好(Autoscaler)| | 成熟度 | 成熟稳定 | 快速增长 | | 生态 | Hadoop生态 | CNCF生态 | | External Shuffle | 原生支持 | 需Shuffle Service | | 本地性 | 好(数据感知) | 差(需Volume挂载)