Spark on Kubernetes部署与资源管理
请介绍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方式 |
|---|---|
| CPU | spark.kubernetes.{driver|executor}.{request|limit}.cores |
| 内存 | spark.{driver|executor}.memory + spark.{driver|executor}.memoryOverhead |
| GPU | spark.kubernetes.executor.limit.cores=gpu |
| 存储 | PVC(持久卷声明)或emptyDir |
| 动态扩展 | Cluster Autoscaler自动扩缩Node |
四、优势与挑战:
优势:
- 弹性伸缩:K8s Cluster Autoscaler自动扩缩Node
- 资源隔离:每个Job在独立Pod中运行
- 统一资源管理:与微服务共享集群
- 快速启动:Pod启动秒级(对比YARN Container分钟级)
- 日志集成:对接K8s日志系统(EFK/Loki)
挑战:
- 网络瓶颈:Shuffle网络IO为瓶颈(需优化网络插件)
- 本地性降低:Pod可能调度到无数据的Node
- 存储集成:需配置PVC或OSS(HDFS需额外部署)
- 监控复杂:需额外配置Prometheus/Grafana
五、YARN vs K8s对比: | 维度 | YARN | K8s | |------|------|-----| | 启动速度 | 较慢(分钟级) | 快(秒级)| | 资源隔离 | Container | Pod + cgroup | | 扩展性 | 有限 | 好(Autoscaler)| | 成熟度 | 成熟稳定 | 快速增长 | | 生态 | Hadoop生态 | CNCF生态 | | External Shuffle | 原生支持 | 需Shuffle Service | | 本地性 | 好(数据感知) | 差(需Volume挂载)