天池-阿里巴巴全球调度大赛总结

前段时间在工作之余参加了阿里巴巴全球调度大赛,打了酱油,复赛成绩最终29名。现在结合参赛过程,以及最终进入决赛成员的分享,总结这篇文章。大赛地址:https://tianchi.aliyun.com/competition/introduction.htm?spm=5176.100066.0.0.23fc33af172p0h&raceId=231663

初赛

赛题介绍

将数万个实例,分布在数千台机器上,要求满足约束的情况下,目标函数值最小。

约束
· 每个实例都标明了CPU、memory、disk此3个维度的资源需求,其中CPU、memory以分时占用曲线的形式给出,在任意时刻,任意一个宿主机A上,所有部署在宿主机A上的实例的任意资源都不能超过宿主机A的该资源容量

· 另外还有P、M、PM三类资源,定义了应用实例的重要程度,任意一台宿主机上的部署数目不能超过该类型宿主机能够容纳的重要应用数目上限

· 混部集群时刻处于复杂的干扰环境中,所以我们需要满足一些规避干扰约束,一条规避干扰约束被描述为<APP_A, APP_B, k>,代表若一台宿主机上存在APP_A类型的实例,则最多能部署k个APP_B类型的实例。注意,k可能为0。APP_A和APP_B也可能代表同一个APP(e.g. <APP_A, APP_A, k>),代表同一台机器上最多可以部署的该APP的实例的数目。

目标函数
在这里插入图片描述

赛题分析

因为赛题的数据规模较大,所以无法用规划器求最优解。分析后,只能使用启发算法进行求解。针对此题,大致有如下几种方法:

  • 遗传算法
  • 模拟退火算法
  • 粒子群算法

然而遗传算法的话,每次求得可行解的计算量太大,效率太低,不适合此场景;综上分析,最终选用了模拟退火算法,即在初始化的时候,使用贪心方法,形成一个解,然后对这个解进行模拟退火算法去不断改进。在使用模拟退火的过程中,主要可以设计成两个操作,分别是借鉴了遗传的交叉和变异。

  • 随机选择两台机器,对其上面的两个实例进行交换,如果最终两台机器的得分和大于交换之前,那么交换之;否则撤销交换;
  • 随机选择某台机器上的实例,随机将其迁移到另一台机器,如果最终这两台机器的得分和大于迁移之前,那么迁移之;否则撤销迁移;

赛题求解

根据上面的赛题分析,最终求得可行解,成功进入复赛,并没有针对数据做更好的优化;后来知道很多高分选手都是一开始先大致确定了最优状态的使用机器数,然后在这个固定机器数下,进行算法的进行。这样效率大大提高,并且解的质量也大幅提高。

复赛

赛题介绍

复赛相比初赛还是有很大不同,首先复赛的初始状态已经是可行解;然后复赛增加了两个新的约束:

  • 增加了离线任务,离线任务的占用机器的时间跨度也不一样;也就是说需要将离线任务也调度到机器上,提高机器利用率;并且离线任务之间有的还有前后依赖关系;
  • 增加了迁移限制,也就是说从初始解到你给出的解,实例的迁移次数不能大于3轮。

赛题分析

由于工作下班之后基本都是晚上9点多了,所以复赛并没有投入过多时间,一开始只是简单复用初赛的解法,将机器分成了两部分,一部分完全用来分配在线任务,一部分完全分配离线任务,很明显这种做法是很差劲的。当时也只是想先跑出个有效解出来,再进行优化。
所以我整个过程分成了两个独立的过程:

  • 先分配在线任务,首先预估出在线任务需要的机器数,然后将在线任务过载的机器上的实例,均匀迁移到空闲机器上,使得整体机器上的实例数大致相当。在此基础上进行模拟退火算法进行优化。
  • 然后再分配离线任务,将离线任务按照依赖关系进行优先级排序,然后顺序遍历,依次安排在剩余机器上。
  • 在迁移的时候,因为一开始的实例主要都集中在一小部分的机器上,所以我也简单处理,就是将一开始的空闲机器上安排上终态的所有实例。然后将初始化机器上剩余的实例(并且终态也不会放在此机器上的实例),迁移至其它非初始化的机器上。这样做完之后,再将非初始化机器上的多余实例安排至最终要部署的机器上。这样两次迁移就可以完成。
  • 然而在去迁移第五个任务时,却遇到了困难,因为第五个人没有离线任务,因而在线任务初始化占用的机器数量就很多,很难进行合理的迁移。最终我只能在模拟退火的时候,限制了迁移轮数,即在每次交叉或变异的时候我都要判断能否三次迁移结束。如果可以的话则交叉或变异,否则不可以。

赛题求解

通过以上的简单处理,最终复赛成绩是第29名,打酱油的名次。下面将重点分析大佬们的解题思路、

总结

复赛18名的github地址:https://github.com/im2608/tianchi_dispatch/tree/dispatch_semifinal
对比发现,在调度在线任务的时候,目标基本一致,基本上就是让每个机器都足够均匀(将重负载机器实例迁移至轻负载机器)。调度离线任务的时候,他是将已分配在线任务的机器也加入到待分配机器之中(这也是我计划要改进的)。基本上做到以上两点,成绩基本可以在20名左右。下面再看一下决赛成员的解决方法

总决赛成员的分享:

  • 冠军:

  • 亚军:

展开阅读全文

没有更多推荐了,返回首页