
1) 【一句话结论】
在Kubernetes集群部署Spark集群时,需通过合理配置资源请求/限制保障调度与资源隔离,结合Prometheus+Grafana实现全链路监控,利用自动重启与滚动更新保障稳定性,并通过内存管理、任务调度优化提升执行效率。
2) 【原理/概念讲解】
3) 【对比与适用场景】
| 特性 | 资源请求(Requests) | 资源限制(Limits) |
|---|---|---|
| 定义 | 宣告Pod需要多少资源(调度依据) | 宣告Pod能消耗的最大资源(资源上限) |
| 作用 | 确保调度时资源充足,避免因资源不足导致调度失败 | 防止资源被过度消耗,保障其他任务资源可用 |
| 适用场景 | 关键组件(如Spark Master、核心Worker)需保障资源 | 非关键任务或资源密集型任务,避免资源争抢 |
| 注意点 | 请求值需合理(过高会导致调度失败,过低可能导致资源争抢) | 限制值需根据节点资源(如节点8核32Gi内存)合理设置(如Worker限制2核16Gi内存) |
| 工具 | Prometheus | Grafana |
|---|---|---|
| 定义 | 开源时间序列数据库,负责指标采集、存储、查询 | 可视化平台,基于Prometheus数据生成自定义仪表盘 |
| 特性 | 自动化数据抓取(如Kubernetes集成、Spark自定义抓取)、时间序列存储、告警规则 | 自定义面板、告警通知、数据探索 |
| 使用场景 | 采集K8s(Pod状态、资源使用率)与Spark(作业数、任务失败率、内存使用率)核心指标 | 可视化监控数据,辅助运维决策(如发现任务失败率升高时,检查资源或数据本地性) |
| 优化参数 | spark.executor.memory | spark.locality.wait |
|---|---|---|
| 定义 | Spark Executor的堆内存大小 | 等待数据本地任务的时间(毫秒) |
| 作用 | 控制Executor内存,避免OOM或内存不足导致任务卡顿 | 提升数据本地性,减少任务迁移 |
| 调整方法 | 根据任务类型(如MapReduce vs GraphX)和节点资源(如节点16Gi内存,Executor设置4-8Gi) | 根据数据分布和任务负载,通常设置为100-1000ms(如300ms) |
| 优化效果 | 合理设置可减少GC停顿,提升任务执行速度 | 适当延长等待时间可提升数据本地性,但过长会导致任务等待时间增加 |
4) 【示例】
# Spark Master Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-master
spec:
replicas: 1
selector:
matchLabels:
app: spark-master
template:
metadata:
labels:
app: spark-master
spec:
containers:
- name: spark-master
image: spark:3.3.1
resources:
requests:
cpu: "500m"
memory: "2Gi"
limits:
cpu: "1"
memory: "4Gi"
# Spark Worker Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-worker
spec:
replicas: 2 # 假设集群有2个Worker节点
selector:
matchLabels:
app: spark-worker
template:
metadata:
labels:
app: spark-worker
spec:
containers:
- name: spark-worker
image: spark:3.3.1
resources:
requests:
cpu: "1"
memory: "8Gi"
limits:
cpu: "2"
memory: "16Gi"
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: spark-monitoring
spec:
groups:
- name: spark-rules
rules:
- alert: SparkMasterDown
expr: up{job="spark-master"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Spark Master is down"
description: "The Spark Master pod is not running"
- alert: HighTaskFailureRate
expr: (sum(rate(spark_task_failed_total{job="my-job"}[5m])) / sum(rate(spark_task_started_total{job="my-job"}[5m]))) * 100 > 10
for: 5m
labels:
severity: warning
annotations:
summary: "High task failure rate for job 'my-job'"
description: "Task failure rate exceeds 10% for the last 5 minutes"
apiVersion: apps/v1
kind: Deployment
metadata:
name: spark-worker
spec:
replicas: 2
selector:
matchLabels:
app: spark-worker
template:
metadata:
labels:
app: spark-worker
spec:
containers:
- name: spark-worker
image: spark:3.3.1
resources:
requests:
cpu: "1"
memory: "8Gi"
limits:
cpu: "2"
memory: "16Gi"
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
5) 【面试口播版答案】
“在Kubernetes上部署Spark集群,核心是通过资源请求/限制保障调度与资源隔离。比如Spark Master设置至少500m CPU和2Gi内存的请求,限制到1核CPU和4Gi内存,这样调度时能优先匹配资源,同时防止资源被耗尽。监控方面,用Prometheus采集K8s和Spark的核心指标(如作业数、任务失败率、资源使用率),再用Grafana做可视化,实时看系统状态。故障恢复上,自动重启让异常Pod能自动恢复,滚动更新逐步更新版本,避免服务中断。优化方面,内存管理上给Spark设置合适的堆内存(比如4Gi),避免OOM;任务调度上通过spark.locality.wait参数控制等待时间,优先调度到数据所在节点,减少任务迁移,提升执行效率。具体来说,Spark Master的请求和限制要匹配集群资源,Worker的配置根据计算任务调整,监控要覆盖关键指标,优化参数需根据实际负载调整。”
6) 【追问清单】
7) 【常见坑/雷区】