SPARK k8s backend中Executor Rolling(Executor的自动化滚动驱逐)

Spark 3.3.0引入了ExecutorRolling特性,这是一种预判执行策略,用于提前避免Executor处理延迟导致的Streaming任务延迟。ExecutorRollPlugin通过周期性检查并根据配置策略选择Executor进行替换,目前仅适用于Spark on Kubernetes。该特性提高了任务调度的灵活性,减少了对任务失败的依赖,并提供了多种驱逐策略,如Executor创建ID、失败任务数等。启用此功能需要设置相关配置,如`spark.plugins`、`spark.decommission.enabled`和`spark.kubernetes.executor.rollInterval`。

背景

本文基于SPARK 3.3.0
在Spark 3.3.0中出现了一个新特性那就是自动重启Executor,这个主要解决是什么问题呢? 主要解决在Streaming中由于一个Executor的处理延迟导致整个Streaming任务延迟,但是这也是适用于批任务,使得批任务Executor的驱逐更加灵活。具体的可参考SPARK-37810

分析

在spark 3.3.0之前,如果发现任务是比较慢或者任务失败了,

  • 可以开启spark.speculation(默认是关闭的),进行推测执行,
  • 也可以开启spark.excludeOnFailure.enabled (默认是关闭的)以保证task不会重新调度到失败的Executor上
  • 如果发现executor失败了,可以开启spark.excludeOnFailure.killExcludedExecutors(默认是关闭的),确保在fetch失败的时候,把execlude给删除掉。
    但是这些都是事后的弥补方式,所以这里提出的Executor Rolling是事前预测执行的方式,该方式会周期性的轮询。

直接看代码ExecutorRollPlugin:

class ExecutorRollPlugin extends SparkPlugin {
  override def driverPlugin(): DriverPlugin = new ExecutorRollDriverPlugin()

  // No-op
  override def executorPlugin(): ExecutorPlugin = null
}

它继承SparkPlugi

使用Kubernetes(k8s)部署一个自动化运维系统可以通过以下几个步骤实现: ### 1. 环境准备 首先,确保你有一个Kubernetes集群。你可以使用本地集群(如Minikube)或云服务提供商的托管Kubernetes服务(如GKE、EKS或AKS)。 ### 2. 创建Docker镜像 将你的自动化运维系统的应用程序打包成一个Docker镜像。确保你的Dockerfile包含所有必要的依赖项和配置。 ```dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"] ``` 构建并推送Docker镜像到Docker Hub或其他容器镜像仓库: ```sh docker build -t yourusername/automated-ops-system:latest . docker push yourusername/automated-ops-system:latest ``` ### 3. 编写Kubernetes配置文件 创建一个YAML配置文件来定义Kubernetes资源,如Deployment、Service和Ingress。 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: automated-ops-system spec: replicas: 3 selector: matchLabels: app: automated-ops-system template: metadata: labels: app: automated-ops-system spec: containers: - name: automated-ops-system image: yourusername/automated-ops-system:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: automated-ops-system-service spec: type: LoadBalancer selector: app: automated-ops-system ports: - port: 80 targetPort: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: automated-ops-system-ingress spec: rules: - host: yourdomain.com http: paths: - path: / pathType: Prefix backend: service: name: automated-ops-system-service port: number: 80 ``` ### 4. 应用配置 使用`kubectl`命令将配置文件应用到Kubernetes集群中: ```sh kubectl apply -f deployment.yaml ``` ### 5. 验证部署 检查Pod的状态,确保它们都已启动并运行: ```sh kubectl get pods ``` 检查Service和Ingress的状态: ```sh kubectl get services kubectl get ingress ``` ### 6. 配置自动化运维工具 根据你的自动化运维系统的需求,配置相应的工具和插件。例如,配置CI/CD工具(如Jenkins、GitLab CI)、监控工具(如Prometheus、Grafana)和日志管理工具(如ELK Stack)。 ### 7. 持续集成和持续部署 确保你的自动化运维系统与你的代码仓库集成,实现持续集成和持续部署。每次代码变更时,自动构建Docker镜像并部署到Kubernetes集群中。 通过以上步骤,你可以使用Kubernetes部署一个自动化运维系统。这个系统可以根据需求进行扩展和管理,提高运维效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值