當前位置:菜譜大全網 - 素菜食譜大全 - 火花紗調度器詳解

火花紗調度器詳解

首先,調度程序的選擇

在Yarn中有三種調度程序可供選擇:FIFO調度程序、容量調度程序和集市調度程序。

FIFO調度器根據提交的順序將申請排列在壹個隊列中,這是壹個先進先出的隊列。分配資源時,先將資源分配給隊列中最靠前的應用程序,滿足最靠前的應用程序要求後再分配給下壹個應用程序,以此類推。

FIFO調度器是最簡單易懂的調度器,不需要任何配置,但是不適合* * *共享集群。大型應用程序可能會占用所有集群資源,從而導致其他應用程序被阻塞。在* * *共享集群中,更適合采用容量調度器或公平調度器,兩者都允許大任務和小任務在提交的同時獲得壹定的系統資源。

下面的“紗線調度程序比較圖”顯示了這些調度程序之間的差異。從圖中可以看出,在FIFO調度器中,小任務會被大任務阻塞。

對於容量調度器,有專門的隊列來運行小任務,但是為小任務設置隊列會提前占用壹定的集群資源,導致大任務的執行時間落後於使用FIFO調度器時的執行時間。

在公平調度器中,我們不需要提前占用壹定的系統資源,公平調度器會為所有正在運行的作業動態調整系統資源。如下圖,第壹個大作業提交時,只有這個作業在運行,此時已經獲得了所有的集群資源;當第二個小任務提交後,公平調度器會將壹半的資源分配給這個小任務,讓兩個任務公平地享受集群資源。

需要註意的是,在下圖所示的公平調度器中,從第二個任務提交到獲取資源會有壹定的延遲,因為它需要等待第壹個任務釋放被占用的容器。小任務執行後也會釋放自己占用的資源,大任務會獲得所有系統資源。最終的結果是,公平調度器既能實現較高的資源利用率,又能保證小任務的及時完成。

紗線調度程序比較圖:

第二,容量調度器的配置。

2.1集裝箱調度簡介

Capacity scheduler允許多個組織* * *享受整個集群,每個組織可以獲得集群的部分計算能力。通過為每個組織分配特殊的隊列,然後為每個隊列分配特定的集群資源,整個集群可以通過設置多個隊列為多個組織提供服務。此外,隊列可以垂直劃分,這樣壹個組織中的多個成員可以* * *享受隊列資源。在隊列中,資源調度基於先進先出(FIFO)策略。

從上圖我們已經知道,壹個作業可能不會使用整個隊列的資源。但是,如果這個隊列中有多個作業在運行,如果這個隊列中的資源足夠,那麽它們將被分配給這些作業。如果這個隊列的資源不夠用怎麽辦?事實上,容量調度器仍然可能向該隊列分配額外的資源,這就是“隊列彈性”的概念。

在正常操作中,容量調度程序不會強制釋放集裝箱。當壹個隊列不夠用時,該隊列只能獲得其他隊列釋放的容器資源。當然,我們可以為隊列設置壹個最大資源使用量,防止這個隊列占用過多的空閑資源,讓其他隊列無法使用這些空閑資源。這就是“彈性隊列”需要權衡的地方。

2.2集裝箱調度的配置

假設我們有以下級別的隊列:

├──產品

└──·德夫

├──工程公司

└──科學

下面是壹個簡單的容量調度器的配置文件,名為capacity-scheduler.xml,在這個配置中,根隊列下定義了兩個子隊列prod和dev,分別占容量的40%和60%。應當註意,隊列的配置是由屬性yarn . scheduler . capacity指定的...,表示隊列的繼承樹,比如root.prod queue,壹般指容量和最大容量。

我們可以看到dev隊列被分成兩個容量相同的子隊列,eng和science。dev的maximum-capacity屬性設置為75%,因此即使prod隊列完全空閑,dev也不會占用所有集群資源,也就是說,prod隊列仍然有25%的可用資源用於緊急情況。我們註意到,在eng和science隊列中沒有設置maximum-capacity屬性,這意味著eng或science隊列中的作業可能會使用整個dev隊列的所有資源(高達集群的75%)。同樣,prod可能會占用集群的所有資源,因為它沒有設置maximum-capacity屬性。

容量容器不僅可以配置隊列及其容量,還可以配置壹個用戶或應用程序可以分配的最大資源數量、可以同時運行多少個應用程序、隊列的ACL認證等等。

2.3隊列設置

隊列的設置取決於我們的具體應用。例如,在MapReduce中,我們可以通過mapreduce.job.queuename屬性指定要使用的隊列。如果隊列不存在,我們將在提交任務時收到壹個錯誤。如果我們不定義任何隊列,所有應用程序都將被放入默認隊列中。

註意:對於Capacity scheduler,我們的隊列名必須是隊列樹的最後壹部分,如果我們使用隊列樹,它將不會被識別。例如,在上面的配置中,我們可以使用prod和eng作為隊列名稱,但如果我們使用root.dev.eng或dev.eng,則無效

第三,公平調度器的配置

3.1公平調度

公平調度器的設計目標是為所有應用分配公平的資源(公平的定義可以通過參數設置)。上面的“紗線調度程序比較圖”顯示了壹個隊列中兩個應用程序的公平調度;當然,公平調度也可以在多個隊列之間工作。例如,假設有兩個用戶A和B,他們都有壹個隊列。當a啟動壹個作業,b沒有任務,a會得到所有的集群資源;當B啟動壹個作業時,A的作業會繼續運行,但過壹段時間後,兩個任務會各獲得壹半的集群資源。如果此時B啟動了第二個作業,而其他作業還在運行,那麽它將與B的第壹個作業***共享這個隊列的資源,即B的兩個作業將使用四分之壹的集群資源,而A的作業仍將使用壹半的集群資源。因此,資源將在兩個用戶之間平均共享。該過程如下圖所示:

3.2啟用公平調度程序

調度器的使用通過yarn-site.xml配置文件中的yarn . resource manager . Scheduler . class參數配置,默認采用容量調度器。如果我們想使用FairScheduler,我們需要在這個參數上配置FairScheduler類的全限定名:org。Apache . Hadoop . yarn . server . resource manager . scheduler . fair . fair scheduler。

3.3隊列的配置

公平調度器的配置文件位於類路徑下的fair-scheduler.xml文件中,可以通過yarn . scheduler . Fair . allocation . file屬性進行修改。沒有這個配置文件,Fair調度器采用的分配策略類似於3.1節介紹的:調度器會在用戶提交第壹個申請時自動為用戶創建壹個隊列,隊列的名稱就是用戶名,所有的申請都會被分配到對應的用戶隊列中。

我們可以在配置文件中配置每個隊列,並且可以像容量調度程序壹樣分層配置隊列。例如,參考capacity-scheduler.xml來配置公平調度程序:

隊列的層次結構是通過嵌套元素實現的。所有隊列都是根隊列的子隊列,即使我們不匹配元素。在這個配置中,我們將dev隊列分為兩個隊列:eng和science。

公平調度器中的隊列有壹個權重屬性(這個權重就是公平的定義),這個屬性作為公平調度的基礎。在本例中,當調度程序將集群40:60的資源分配給prod和dev時,這被認為是公平的,並且eng和science隊列沒有定義權重,因此它們將被平均分配。這裏的權重不是百分比。我們把上面的40和60分別換成2和3,效果是壹樣的。請註意,沒有配置文件的用戶自動創建的隊列仍然有權重,權重值是1。

每個隊列中仍然可以有不同的調度策略。隊列的默認調度策略可以通過頂級元素進行配置。如果沒有配置,默認情況下將采用公平調度。

雖然它是壹個公平的調度器,但它仍然支持隊列級的FIFO調度。每個隊列的調度策略可以被其內部元素所覆蓋。在上面的例子中,prod隊列被指定使用FIFO進行調度,因此提交給prod隊列的任務可以按照FIFO規則的順序執行。應該註意的是,prod和dev之間的調度仍然是公平的,eng和science之間的調度也是如此。

雖然上面的配置中沒有顯示,但是每個隊列仍然可以配置最大和最小的資源占用率,以及可以運行的應用程序的最大數量。

3.4隊列設置

公平調度程序使用基於規則的系統來確定應用程序應該放在哪個隊列中。在上面的例子中,元素定義了壹個規則列表,每個規則都將被逐壹嘗試,直到匹配成功。例如,如果指定了上面示例中的第壹個規則,應用程序將被放入它所指定的隊列中。如果應用程序沒有指定隊列名稱或者隊列名稱不存在,則意味著規則不匹配,然後嘗試下壹個規則。primaryGroup規則將嘗試將應用程序放入以用戶的Unix組名命名的隊列中。如果沒有隊列,請嘗試下壹個規則,而不是創建隊列。當前面的所有規則都不滿足時,默認規則被觸發,應用程序被放在dev.eng隊列中。

當然,我們不能配置queuePlacementPolicy規則,調度程序默認采用以下規則:

上面的規則可以用壹句話來概括,除非隊列定義準確,否則會以用戶名作為隊列名來創建隊列。

還有壹個簡單的配置策略,將所有應用程序放在同壹個隊列中(默認),這樣所有應用程序都可以平等地享受集群,而不是在用戶之間。該配置定義如下:

要實現以上功能,我們還可以設置紗線。scheduler . fair . user-as-default-queue = false而不使用配置文件,這樣應用程序將被放入默認隊列而不是用戶名隊列。此外,我們可以設置紗線。scheduler . fair . allow-undefined-pools = false,因此用戶無法創建隊列。

3.5先占權

當作業提交到繁忙集群中的空隊列時,該作業不會立即執行,而是被阻塞,直到正在運行的作業釋放系統資源。為了使作業提交的執行時間更可預測(可以設置等待超時),公平調度器支持搶占。

搶占是允許調度器殺死占用超過其資源隊列份額的容器,而這些容器資源可以分配給應該享有這些共享資源的隊列。需要註意的是,搶占會降低集群的執行效率,因為終止的容器需要重新執行。

您可以通過設置全局參數yarn來啟用搶占。調度程序。公平。搶占=真。另外,有兩個參數控制搶占的過期時間(這兩個參數默認不配置,至少需要配置壹個參數來允許搶占容器):

-最小共享搶占超時

-公平份額搶占超時

如果隊列在最小共享搶占超時指定的時間內沒有獲得最小資源保證,調度程序將搶占容器。我們可以通過配置文件中的頂級元素為所有隊列配置此超時;我們也可以在元素中配置元素,為隊列指定超時。

類似地,如果隊列在公平份額搶占超時指定的時間內沒有獲得壹半的相等資源(這個比率可以配置),調度器將搶占容器。這個超時可以分別通過頂級元素和元素級元素配置所有隊列和壹個隊列的超時。上面提到的比率可以通過(配置所有隊列)和(配置壹個隊列)來配置,默認為0.5。