使用自定义插件和调度框架在 Kubernetes 上优化 Apache Spark
Optimizing Apache Spark on Kubernetes using custom plugins and the scheduling framework
我的目标是优化 运行 Spark 应用程序和集群中的无状态工作负载,以充分利用我的集群资源。
由于 Spark 应用程序可能会受到部分调度的影响(驱动程序阻塞执行程序,因为驱动程序 pods 首先启动,然后请求执行程序 pods),防止这种情况的简单策略是实施经常讨论的 gang/co-scheduling 以确保我们仅在我们可以保证所有执行程序都可以在未来启动时才启动驱动程序 pod,方法是实施某种预留设计,以便驱动程序可以预留资源对于以后要启动的executors
此外,此预留 definition/implementation 必须对所有其他非 spark pods 可见,因为他们也必须像 Spark pods 一样记录他们的资源请求,所以我们对集群资源利用率有了清晰的了解。
当前的实现包括 运行为此创建一个新的自定义调度程序或实现一个调度程序扩展程序,但我想知道我们是否可以通过编写自定义调度程序插件来实现这一点。此外,插件必须利用调度框架中的哪些扩展点来优化多租户环境(具有不同类型的工作负载)中的 Spark 作业调度,以便我的默认配置文件可以继续调度无状态工作负载,同时使用这些插件的自定义配置文件可以调度 Spark 应用程序吗?
最后,这是在多租户环境中优化调度 Spark 和无状态工作负载的最佳方式吗?这种方法(使用自定义插件)的缺点是什么,因为我们只有一个所有配置文件必须共享的队列?
听起来您想要的是Gang Scheduling . If you'd like to have that capability, I suggest you use Volcano to schedule/run your jobs in Kubernetes with Gang Scheduling。
另一种方法是使用 scheduler extender as described here or use the Palantir gang scheduler extender.
创建您自己的调度程序
✌️
我的目标是优化 运行 Spark 应用程序和集群中的无状态工作负载,以充分利用我的集群资源。
由于 Spark 应用程序可能会受到部分调度的影响(驱动程序阻塞执行程序,因为驱动程序 pods 首先启动,然后请求执行程序 pods),防止这种情况的简单策略是实施经常讨论的 gang/co-scheduling 以确保我们仅在我们可以保证所有执行程序都可以在未来启动时才启动驱动程序 pod,方法是实施某种预留设计,以便驱动程序可以预留资源对于以后要启动的executors
此外,此预留 definition/implementation 必须对所有其他非 spark pods 可见,因为他们也必须像 Spark pods 一样记录他们的资源请求,所以我们对集群资源利用率有了清晰的了解。
当前的实现包括 运行为此创建一个新的自定义调度程序或实现一个调度程序扩展程序,但我想知道我们是否可以通过编写自定义调度程序插件来实现这一点。此外,插件必须利用调度框架中的哪些扩展点来优化多租户环境(具有不同类型的工作负载)中的 Spark 作业调度,以便我的默认配置文件可以继续调度无状态工作负载,同时使用这些插件的自定义配置文件可以调度 Spark 应用程序吗?
最后,这是在多租户环境中优化调度 Spark 和无状态工作负载的最佳方式吗?这种方法(使用自定义插件)的缺点是什么,因为我们只有一个所有配置文件必须共享的队列?
听起来您想要的是Gang Scheduling . If you'd like to have that capability, I suggest you use Volcano to schedule/run your jobs in Kubernetes with Gang Scheduling。
另一种方法是使用 scheduler extender as described here or use the Palantir gang scheduler extender.
创建您自己的调度程序✌️