Yunikorn的GangScheduler调度

1,161 阅读3分钟

Yunikorn的GangScheduler主要作用

GangScheduler是一种群组调度方式,同一任务群组(Yunikorn的task-group)内的应用共用一部分预留空间。在任务群组的定义中声明了预留的资源空间,Yunikorn会在启动任务时创建用于占位的容器(Yunikorn的placeholder),确保群组内的应用得到调度。 对于启用GangScheduler的任务,满足最小资源请求时会得到yunikorn的调度,否则任务将在队列中等待。每个资源队列分配最大数量的容器并发运行,并保证可运行任务的最小资源。

image.png

Job部署试验用例

image.png

Job部署的Yunikorn调度(Gang Schedule模式)

前提条件

所使用的调度队列需声明为FIFO策略。

应用配置

为了使任务被Yunikorn识别并调度,需要在YAML中添加如下注解。

AnnotationValue
yunikorn.apache.org/task-group-nameTask group name, it must be unique within the application
yunikorn.apache.org/task-groupsA list of task groups, each item contains all the info defined for the certain task group
yunikorn.apache.org/schedulingPolicyParametersOptional. A arbitrary key value pairs to define scheduling policy parameters. Please readschedulingPolicyParameters section

task-group即需要被统一调度的一组应用(gang of app),同组应用使用相同的资源方案和调度策略。以Spark任务为例,可以分为driver任务组和executor任务组。

task-group的定义(即“task-groups”注解)与实际Pod格式相同,用于Yunikorn提前准备占位容器。

验证方式

1.检查是否创建了对应数量的占位容器(Placeholders)。例如两个任务组(taskGroup),每个任务组的最小成员数量(minMember)是3,则任务(job)提交时应当创建6个占位容器。

2.检查占位容器的定义(spec)是否与任务组(taskGroup)的定义相同。

3.检查占位容器是否能正常启动,生成实际Pod。

配置举例

image.png 其中的关键配置项是

completions: 4

parallelism: 2

"minMember": 8

配置Job为总计完成4个任务(completions),最大并行2个任务(parallelism),则同一时刻最多有两个容器并发运行。但由于配置了task-group的最小成员数量是8(minMember),所以启动Job后Yunikorn实际创建了8个Pod,其中两个用于实际运行,其余为占位容器。

image.png

高级参数

  • placeholderTimeoutInSeconds:该项参数默认值为十五分钟。当Yunikorn开始分配占位容器后,如果超过15分钟仍未分配完成全部占位容器,则退出所有占位容器。注:Yunikorn在一开始没有分配任何占位容器时并不计时。

  • gangSchedulingStyle:分为Soft和Hard两种模式,未来会引入更多模式。Soft为默认模式,如果应用始终得不到实际调度,则清理所有占位容器并交由默认调度器运行应用。Hard模式下如果应用始终得不到实际调度,则计时器超时后标记所有容器(包括应用容器和占位容器)状态为失败。

任务群的调度试验

先启动一组任务(图中test1),并为其所在的任务群声明超额的占位容器。再启动另一组任务(图中test2),挂靠到同一任务群,监测任务(图中test2)是否进入占位容器运行。

image.png

相比单独调度test1,容器3和容器4作为预留的占位容器,被用于test2的运行。