繁体   English   中英

集群的作业调度算法

[英]Job scheduling algorithm for cluster

我正在寻找适合以下问题的算法:

有多台计算机(确切数字未知)。 每台计算机从某个中央队列中提取作业,完成作业,然后提取下一个。 作业是由某些用户组产生的。 有些用户提交很多工作,有些则提交一些。 作业消耗相等的CPU时间(不是真的,只是近似值)。

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

我正在为此计划寻找一个好的算法。

被认为是两个候选人:

  1. 类似于Hadoop的公平调度程序。 这里的问题是:当群集大小未知时,我可以在哪里获取最少的份额?
  2. 将罚款与每个用户相关联。 安排用户的工作时增加罚款。 使用向用户调度作业的概率为1 - (normalized penalty) 这有点像大步调度,但是我找不到很好的解释。

当我实现了一个非常相似的工作运行程序(用于生产系统)时,我结束了让每个服务器随机选择工作类型的任务。 这是我的理由-

  • 来自一个用户的大量工作不应影响其他用户运行其工作的机会(用户-用户公平性)

  • 一种工作类型过剩不应影响其他工作类型运行的机会(用户职位和工作职位公平性)

  • 如果一位用户等待运行的作业类型只有一种,则所有服务器都应运行这些作业(不浪费容量)

  • 系统应“公平地”运行作业,即与等待的用户和作业类型的数量成正比,而不是与总的等待作业成比例(一种作业类型的数量过多,不应引起计划的支持)(作业类型公平性)

  • 服务器的数量可以变化,并且事先未知

  • 调度程序知道等待的作业,作业类型和用户元数据,但作业数据不知道(即,用户名,作业名和计数,而不是有效负载)

  • 我还希望每台服务器都是独立的,以自动安排自己的工作,而不必了解其他服务器

我确定的解决方案是通过其{user,jobtype}属性元组跟踪等待的作业,并让每个调度步骤随机选择5个元组,然后从每个元组中最多选择10个要运行的作业。 选定的工作入围,由下一个可用的运行者运行。 每当释放出容量来运行更多作业时(由于作业完成或由于二级限制而导致它们无法运行),请运行另一个计划步骤以获取更多工作。

作业被原子锁定,这是被提取的一部分。 锁阻止了它们再次被获取或参与进一步的调度决策。 如果它们无法运行,它们将被解锁,从而有效地将它们返回到池中。 锁超时,因此运行它们的服务器负责使锁保持刷新状态(如果服务器崩溃,其他服务器将使其锁超时,并拾取并运行它已启动但未完成的作业)

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

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

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

可以添加许多次要限制(例如,每秒不超过5个打入linkedin的呼叫),但这是系统的核心。

您可以尝试使用Adaptive Computing的 Torque资源管理和Maui批处理作业计划软件。 毛伊岛的政策足够灵活,可以满足您的需求。 它支持回填,可配置的作业和用户优先级以及资源预留。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM