亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
886
2025-04-02
4.3.3? 公平調度器配置
公平調度器旨在為所有運行的應用公平分配資源。圖4-3展示了同一個隊列中的應用是如何實現資源公平共享的。然而公平共享實際也可以在多個隊列間工作,后續會對此進行分析。
術語queue和pool在公平調度器的上下文中會交替使用。
接下來解釋資源是如何在隊列之間公平共享的。想象兩個用戶A和B,分別擁有自己的隊列(參見圖4-4)。A啟動一個作業,在B沒有需求時A會分配到全部可用資源;當A的作業仍在運行時B啟動一個作業,一段時間后,按照我們先前看到的方式,每個作業都用到了一半的集群資源。這時,如果B啟動第二個作業且其他作業仍在運行,那么第二個作業將和B的其他作業(這里是第一個)共享資源,因此B的每個作業將占用四分之一的集群資源,而A仍繼續占用一半的集群資源。最終的結果就是資源在用戶之間實現了公平共享。
圖4-4. 用戶隊列間的公平共享
公平調度器的使用由屬性yarn.resourcemanager.scheduler.class的設置所決定。默認是使用容量調度器(盡管在一些Hadoop分布式項目,如CDH中是默認使用公平調度器),如果要使用公平調度器,需要將yarn-site.xml文件中的yarn. resourcemanager.scheduler.class設置為公平調度器的完全限定名:org.apache. hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。
通過一個名為fair-scheduler.xml的分配文件對公平調度器進行配置,該文件位于類路徑下。(可以通過設置屬性yarn.scheduler.fair.allocation.file來修改文件名)。當沒有該分配文件時,公平調度器的工作策略同先前所描述的一樣:每個應用放置在一個以用戶名命名的隊列中,隊列是在用戶提交第一個應用時動態創建的。
通過分配文件可以為每個隊列進行配置。這樣可以對容量調度器支持的層次隊列進行配置。例如,可以像為容量調度器所做的那樣,使用范例4-2所示的分配文件定義prod和dev。
范例4-2. 公平調度器的分配文件
隊列的層次使用嵌套queue元素來定義。所有的隊列都是root隊列的孩子,即使實際上并沒有嵌套進root queue元素里。這里把dev隊列又劃分成eng和science兩個隊列。
隊列中有權重元素,用于公平共享計算。在這個例子中,當集群資源按照40:60的比例分配給prod和dev時,集群分配被認為是公平的。eng和science隊列沒有指定權重,因此它們會被平均分配。權重并不是百分百,例子中是為了簡單起見使用了相加之和為100的兩個數。也可以為prod和dev隊列分別指定2和3的權重,在效果上是一樣的。
當設置權重時,記住要考慮默認隊列和動態創建的隊列(例如以用戶名命名的隊列)。雖然沒有在分配文件中為它們指定權重,但它們仍有值為1的權重。
每個隊列可以有不同的調度策略。隊列的默認調度策略可以通過頂層元素defaultQueueSchedulingPolicy進行設置,如果省略,默認使用公平調度。盡管名稱是“公平”,公平調度器也支持隊列級別的FIFO(fifo)策略,以及Dominant Resource Fairness(drf)策略,本章稍后會對此策略進行解釋。
隊列的調度策略可以被該隊列的schedulingPolicy 元素指定的策略覆蓋。在上述例子中,由于我們希望每個生產性作業能夠順序運行且在最短可能的時間內結束,所以prod隊列使用了FIFO調度策略。值得注意的是,在prod和dev隊列之間、eng和science隊列之間及內部劃分資源仍然使用了公平調度。
盡管上述的分配文件中沒有展示,每個隊列仍可配置最大和最小資源數量,及最大可運行的應用的數量(更多細節可以訪問http://bit_ly/fair_schedular)。最小資源數量不是一個硬性的限制,但是調度器常用它對資源分配進行優先排序。如果兩個隊列的資源都低于它們的公平共享額度,那么遠低于最小資源數量的那個隊列優先被分配資源。最小資源數量也會用于接下來將介紹的搶占行為。
公平調度器使用一個基于規則的系統來確定應用應該放到哪個隊列。在范例4-2中,queuePlacementPolicy 元素包含了一個規則列表,每條規則會被依次嘗試直到匹配成功。第一條規則,specified,表示把應用放進所指明的隊列中,如果沒有指明,或如果所指明的隊列不存在,則規則不匹配,繼續嘗試下一條規則。primaryGroup規則會試著把應用放在以用戶的主Unix組名命名的隊列中,如果沒有這樣的隊列,則繼續嘗試下一條規則而不是創建隊列。Default規則是一條兜底規則,當前述規則都不匹配時,將啟用該條規則,把應用放進dev.eng隊列中。
當然,可以完全省略queuePlacementPolicy元素,此時隊列放置默認遵從如下規則:
換而言之,除非明確定義隊列,否則必要時會以用戶名為隊列名創建隊列。
另一個簡單的隊列放置策略是,將所有的應用放進同一個隊列(default)中。這樣可以在應用之間公平共享資源,而不是在用戶之間共享。策略定義等價于以下規則:
不使用分配文件也可以設置以上策略,通過將屬性yarn.scheduler.fair.user-as-default-queue設為false,應用就會被放入default 隊列,而不是各個用戶的隊列。另外,將屬性yarn.scheduler.fair.allow-undeclared-pools設置為false,用戶便不能隨意創建隊列了。
在一個繁忙的集群中,當作業被提交給一個空隊列時,作業不會立刻啟動,直到集群上已經運行的作業釋放了資源。為了使作業從提交到執行所需的時間可預測,公平調度器支持“搶占”(preemption)功能。
所謂搶占,就是允許調度器終止那些占用資源超過了其公平共享份額的隊列的容器,這些容器資源釋放后可以分配給資源數量低于應得份額的隊列。注意,搶占會降低整個集群的效率,因為被終止的containers需要重新執行。
通過將yarn.scheduler.fair.preemption設置為true,可以全面啟用搶占功能。有兩個相關的搶占超時設置:一個用于最小共享(minimum share preemption timeout),另一個用于公平共享(fair share preemption timeout),兩者設定時間均為秒級。默認情況下,兩個超時參數均不設置。所以為了允許搶占容器,需要至少設置其中一個超時參數。
如果隊列在minimum share preemption timeout指定的時間內未獲得被承諾的最小共享資源,調度器就會搶占其他容器??梢酝ㄟ^分配文件中的頂層元素defaultMinSharePreemptionTimeout為所有隊列設置默認的超時時間,還可以通過設置每個隊列的minSharePreemptionTimeout元素來為單個隊列指定超時時間。
類似,如果隊列在fair share preemption timeout指定的時間內獲得的資源仍然低于其公平共享份額的一半,那么調度器就會搶占其他容器??梢酝ㄟ^分配文件中的頂層元素defaultFairSharePreemptionTimeout為所有隊列設置默認的超時時間,還可以通過設置每個隊列的fairSharePreemptionTimeout元素來為單個隊列指定超時時間。通過設置defaultFairSharePreemptionThreshold和fairSharePreemptionThreshold (針對每個隊列)可以修改超時閾值,默認值是0.5。
Hadoop 大數據
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。