【阅读原文】戳:打破资源边界、告别资源浪费:ACK One多集群Spark和AI作业调度
概述
在云原生时代,随着业务的发展(如业务遍布全球、已达单一集群承载上限)、容灾需求的迫切、安全合规的要求等原因,越来越多的用户采用多Kubernetes集群来承载业务。而在Kubernetes集群中部署业务应用时,出于应用可靠性考虑,管理员通常会预留相当的资源Buffer来应对负载波动,这样就会导致大多数时间内,容器的请求资源远高于实际使用的资源,集群资源利用率低;此时,我们往往会在多集群中运行离线任务来提升资源利用率,但如何确定哪个集群具有充足资源,将离线任务调度到哪个集群,如何确保离线任务的运行不影响已运行的在线服务,则是更为重要的问题。
Spark作为大数据和AI领域中广泛使用的分布式计算框架,ACK One多集群AI作业调度支持Spark作业的多集群调度与分发,并结合ACK Koordinator的在离线混部的能力,可以解决上述问题,在不影响集群中正在运行的在线业务的前提下,根据各集群实际剩余资源来进行调度,最大化多集群中闲置资源的利用率。
ACK One多集群AI作业调度与分发
分布式云容器平台ACK One[1]是阿里云面向混合云、多集群、分布式计算、容灾等场景推出的企业级分布式云容器平台,提供多集群统一管理能力。通过ACK One注册集群[2]将您的其他公共云厂商和IDC K8s集群接入到阿里云容器服务ACK控制台,并由舰队对这些注册集群以及云上的ACK、ACK Edge集群进行多集群统一的应用分发、流量管理、可观测运维管理、安全管理等。
ACK One多集群AI作业调度与分发[3]是阿里云面向多集群和混合云场景提供的多集群AI作业调度和分发的能力。当单一ACK集群无法满足大规模AI训练和推理任务的资源需求,或当前已有的多个ACK集群有较多资源闲置时,您可以使用该能力,将任务调度到多个集群,以满足您的资源需求。具有以下能力:
1. 支持多种作业类型:PyTorchJob、SparkApplication、TFJob。
2. 多集群Gang调度:通过预占或动态资源检测,实现作业的多集群Gang调度,确保任务下发到子集群后能够调度,提升任务调度效率。
3. 多租户配额管理:用户可以使用ElasticQuotaTree提供的基于Namespace的资源管理,在多租户场景下限制各租户的资源使用量。
4. 任务优先级调度:依据用户在AI任务中的PodTemplate中定义的PriorityClass,确保高优先级任务优先获得集群资源。
5. 多种任务排队策略配置:您可以灵活定义各队列的排队策略,满足优先提高集群利用率或优先保证任务优先级两种使用方式,支持阻塞调度模式和非阻塞调度模式。
6. 作业失败后的重调度:作业在子集群中失败后,Global Scheduler将回收该作业,并对其进行重调度,调度到其他符合条件且资源充足的集群。
具体流程如下:
1. 舰队提交PyTorchJob、SparkApplication或TFJob等类型作业和分发策略PropagationPolicy。
2. 舰队对作业进行优先级调度和租户配额管理Capacity Scheduling。
3. 舰队中的Global Scheduler,对出队列的作业进行多集群动态资源调度和多集群Gang调度,对满足条件的集群进行资源预占或动态资源检查,调度失败则重新入队列。
4. 调度成功后,作业按策略分发到对应的ACK集群中。
5. 若作业运行失败,Global Scheduler将回收作业,并对其进行重调度,调度到其他符合条件且资源充足的集群。
基于实际剩余资源的多集群Spark作业调度与分发
基于集群实际剩余资源的多集群Spark作业的调度和分发方案,主要依赖以下三部分能力:
1. ACK One舰队的多集群Spark作业的调度和分发,包括对实际剩余资源的感知调度。
2. ACK Koordinator[4]的单集群在离线混部[5]能力。
3. ACK Spark Operator[6]支持Koordinator在离线混部特性。
基于实际剩余资源的调度
在单ACK集群中基于实际剩余资源的调度,即为ACK Koordinator的动态资源超卖。ACK Koordinator使用Batch的概念描述实际剩余资源,并通过Kubernetes的Extended Resource[7]将其记录在Node上。从下图我们可以看到,当基于Scheduler按照默认的Request资源进行调度时,4是闲置的资源,可新调度的资源仅有最上方的浅灰色部分;而基于Koordinator的Batch资源进行调度,则可以将闲置的资源充分利用起来(5+6)。为性能考虑,Koordinator还可以设置一定的比例的预留资源,设置方式可详见ACK Koordinator启用动态资源超卖[8]。
依据ACK Koordinator的该混部能力,ACK Spark Operator实现了,支持根据相应注解,将SparkApplication的driver和executor所需资源,转换为Koordiantor的Batch资源,由ACK Scheduler调度Pod时根据Batch资源进行调度。
在多集群维度,舰队的Gloabl Scheduler在进行多集群作业调度时,动态资源调度会动态感知子集群剩余资源,如果是Spark作业,会根据相应的注解,将为driver和executor所需资源检测各子集群的Batch资源是否充足,结合Global Scheduler的多集群Gang调度,来决定将作业分发到哪个集群中。在1.28及以上版本的ACK集群中,舰队会通过资源预占能力来提升作业调度的成功率。并且舰队的Gloabl Scheduler还会监视子集群中Spark作业运行状态,若driver因资源不足而无法运行,则在一定时间后回收该SparkApplication,并重调度到其他资源充足的子集群中。
完整方案流程
完整的基于集群实际剩余资源的多集群Spark作业的调度和分发方案流程如下:
1. 环境准备:
a. 创建ACK One舰队,并将多个ACK集群关联到舰队,由舰队统一管理;
b. 在各ACK集群中安装ACK Koordinator,并通过配置管理混部策略[9];
c. 确定要分发的SparkApplication的命名空间,在舰队和各ACK集群中创建该命名空间,并在安装ACK Spark Operator时配置为其处理的命名空间。
2. 在ACK One舰队中SparkApplication和PropagationPolicy,舰队的多集群调度组件(Global Scheduler)会根据每个关联子集群的实际剩余资源,来匹配Spark作业资源请求,完成调度。在1.28及以上版本的ACK集群中,舰队会通过资源预占能力来提升作业调度的成功率。
a. 该步骤,可同时使用PriorityClass,将提交的Spark作业设置为低优先级,以确保证提交的Spark作业不会抢占在线服务资源、影响在线服务产品的正常运行。
3. 舰队调度作业成功后,会将该SparkApplication分发至调度选中的ACK集群中。
4. 若作业运行失败,Global Scheduler将回收作业,并对其进行重调度,调度到其他符合条件且资源充足的集群。
另外,通过PriorityClass降低Spark作业的优先级,和ACK Koordinator自身支持QoS能力,可以确保运行的Spark作业不会影响对应集群中在线服务的正常运行。
总结
综上所述,ACK One多集群Spark作业的调度与分发,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。ACK One还支持PytorchJob、TFJob等其他AI作业类型的多集群调度。更多内容可详见基于实际剩余资源的多集群Spark调度最佳实践[10]和ACK One多集群AI作业调度与分发[11]。
欢迎加入ACK One 客户交流钉钉群,与我们一同交流。(钉钉群号:35688562)
相关链接:
[1] 分布式云容器平台ACK One
[2] ACK One注册集群
[3] ACK One多集群AI作业调度与分发
[4] ACK Koordinator
[5] 在离线混部
[6] ACK Spark Operator
[7] Extended Resource
https://kubernetes.io/docs/tasks/administer-cluster/extended-resource-node/
[8] ACK Koordinator启用动态资源超卖
[9] 管理混部策略
[10] 基于实际剩余资源的多集群Spark调度最佳实践
[11] ACK One多集群AI作业调度与分发
我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。
获取关于我们的更多信息~