Yunikorn的GangScheduler主要作用
GangScheduler是一种群组调度方式,同一任务群组(Yunikorn的task-group)内的应用共用一部分预留空间。在任务群组的定义中声明了预留的资源空间,Yunikorn会在启动任务时创建用于占位的容器(Yunikorn的placeholder),确保群组内的应用得到调度。 对于启用GangScheduler的任务,满足最小资源请求时会得到yunikorn的调度,否则任务将在队列中等待。每个资源队列分配最大数量的容器并发运行,并保证可运行任务的最小资源。
Job部署试验用例
Job部署的Yunikorn调度(Gang Schedule模式)
前提条件
所使用的调度队列需声明为FIFO策略。
应用配置
为了使任务被Yunikorn识别并调度,需要在YAML中添加如下注解。
| Annotation | Value |
| yunikorn.apache.org/task-group-name | Task group name, it must be unique within the application |
| yunikorn.apache.org/task-groups | A list of task groups, each item contains all the info defined for the certain task group |
| yunikorn.apache.org/schedulingPolicyParameters | Optional. 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。
配置举例
其中的关键配置项是
completions: 4
parallelism: 2
"minMember": 8
配置Job为总计完成4个任务(completions),最大并行2个任务(parallelism),则同一时刻最多有两个容器并发运行。但由于配置了task-group的最小成员数量是8(minMember),所以启动Job后Yunikorn实际创建了8个Pod,其中两个用于实际运行,其余为占位容器。
高级参数
-
placeholderTimeoutInSeconds:该项参数默认值为十五分钟。当Yunikorn开始分配占位容器后,如果超过15分钟仍未分配完成全部占位容器,则退出所有占位容器。注:Yunikorn在一开始没有分配任何占位容器时并不计时。
-
gangSchedulingStyle:分为Soft和Hard两种模式,未来会引入更多模式。Soft为默认模式,如果应用始终得不到实际调度,则清理所有占位容器并交由默认调度器运行应用。Hard模式下如果应用始终得不到实际调度,则计时器超时后标记所有容器(包括应用容器和占位容器)状态为失败。
任务群的调度试验
先启动一组任务(图中test1),并为其所在的任务群声明超额的占位容器。再启动另一组任务(图中test2),挂靠到同一任务群,监测任务(图中test2)是否进入占位容器运行。
相比单独调度test1,容器3和容器4作为预留的占位容器,被用于test2的运行。