2015-02-07 123 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。毛伊政策足夠靈活以適應您的需求。它支持回填,可配置的作業和用戶優先級以及資源預留。