2015-02-07 141 views
1

我正在寻找适合以下问题的算法:集群的作业调度算法

有多台计算机(确切的编号是未知的)。每台计算机从一些中央队列中拉出作业,完成作业,然后拉下一个作业。工作由一些用户组生成。有些用户提交了很多工作,有些是一些。乔布斯消耗相同的CPU时间(不是真的,只是近似)。

调度作业时,中央队列应该是公平的。此外,提交大量工作的用户应该拥有最少的资源份额。

我在为这个调度寻找一个好的算法。

考虑了两个候选人:

  1. 类Hadoop公平调度。这里的问题是:当我的群集规模未知时,我可以在哪里获取最少的份额?
  2. 将一些处罚与每个用户相关联。当用户的工作安排时增加罚款。对用户使用调度作业的概率为1 - (normalized penalty)。这是类似步伐安排,但我找不到任何好的解释。

回答

1

当我实现了一个非常类似的工作亚军(生产系统),我结束了每个服务器随机选择jobtypes。这是我的推理 -

  • 的作业从一个用户过剩不应影响其本职工作运行(用户到用户的公平性)的其他用户的机会

  • 一个jobtype的过剩不应该影响其他jobtypes正在运行(用户作业和作业岗位的公平性)

  • 的机会,如果只有一个从一个用户等待运行,所有服务器都应该运行这些作业jobtype(无浪费的容量)

  • 该系统应该“公平地”运行工作,即与等待的用户和工作类型的数量成正比,而不是等待的总工作量(大量的一种工作类型不应该导致调度对其有利)(工作类型公平)

  • 服务器的数量可以变化,且事先不

  • 等待处理的作业,jobtypes和用户的元数据是已知的调度已知的,但不是作业数据(即用户名,jobnames和计数,但不有效载荷)

  • 我也希望每个服务器都是独立的,自己安排自己的工作,而不必知道其他的ř服务器

我上定居的解决方案是通过{用户,jobtype}属性的元组来跟踪等待处理的作业,并且具有每个调度步骤随机选择5元组,并从每个元组最多10个作业到下一个运行。所选择的工作被列入下一个可用的跑步者的名单。每当容量释放出来运行更多的作业(无论是因为作业完成还是由于次要限制,它们都无法运行)时,运行另一个调度步骤以获取更多作业。

作业被原子锁定作为被抓取的一部分;这些锁妨碍了它们被再次提取或参与进一步的调度决策。如果他们未能运行,他们会被解锁,有效地将他们返回到游泳池。锁定超时,所以运行它们的服务器负责保持锁的刷新(如果服务器崩溃,其他服务器将超时锁并将启动并运行它启动但未完成的作业)

对于我的用例,我希望用户A和B的作业A.1,A.2,A.3和B.1分别获得25%的资源(即使这意味着用户A获得了75%的用户B的25 %)。在四个元组之间随机地选择概率收敛到25%。

如果您希望用户A和B每个都有50-50的资源分配,并且A的A.1,A.2和A.3与B的B.1获得了相同的份额,则可以运行两级调度程序,并随机选择用户并从这些用户中选择工作。这将平等地在用户之间分配资源,并且在每个用户的工作中平均分配工作类型。

大量的特定工作类型的工作需要很长时间才能完成,但情况总是如此。通过从各个用户中进行选择,工作类型对作业处理的响应性不会产生负面影响。

可以添加很多次要限制(例如,每秒对linkedin不超过5次调用),但上述是系统的核心。

0

你可以试试扭矩资源管理和茂宜批量作业调度软件Adaptive Computing。毛伊政策足够灵活以适应您的需求。它支持回填,可配置的作业和用户优先级以及资源预留。