[譯]Hadoop Yarn上的調度器

      網友投稿 877 2025-03-31

      1. 引言


      Yarn在Hadoop的生態系統中擔任了資源管理和任務調度的角色。在討論其構造器之前先簡單了解一下Yarn的架構。

      上圖是Yarn的基本架構,其中 ResourceManager 是整個架構的核心組件,負責集群上的資源管理,包括內存、CPU以及集群上的其他資; ApplicationMaster 負責在生命周期內的應用程序調度; NodeManager 負責本節點上資源的供給和隔離;Container 可以抽象的看成是運行任務的一個容器。本文討論的調度器是在 ResourceManager 進行調度,接下來在了解一下 FIFO 調度器、Capacity 調度器、Fair 調度器三個調度器。

      2. FIFO調度器

      上圖顯示了 FIFO 調度器的實現(執行過程示意圖)。FIFO 調度器是先進先出(First In First Out)調度器。FIFO 調度器是 Hadoop 使用最早的一種調度策略,可以簡單的將其理解為一個 Java 隊列,這就意味著在集群中同時只能有一個作業運行。所有的應用程序按照提交順序來執行,在上一個 Job 執行完成之后,下一個 Job 按照隊列中的順序執行。FIFO調度器以獨占集群全部資源的方式來運行作業,這樣的好處是 Job 可以充分利用集群的全部資源,但是對于運行時間短,優先級高或者交互式查詢類的MR Job 需要等待它之前的 Job 完成才能被執行,這也就導致了如果前面有一個比較大的 Job 在運行,那么后面的 Job 將會被阻塞。因此,雖然 FIFO 調度器實現簡單,但是并不能滿足很多實際場景的要求。這也就促使 Capacity 調度器和 Fair 調度器的誕生。

      增加作業優先級的功能后,可以通過設置?mapred.job.priority?屬性或 JobClinet 的?setJobPriority?方法來設置優先級。在作業調度器選擇要運行的下一個作業時,FIFO 調度器中不支持優先級搶占,所以高優先級的作業會受阻于前面已經開始,長時間運行的低優先級的作業。

      3. Capacity調度器

      上圖顯示了 Capacity 調度器的實現(執行過程示意圖)。Capacity 調度器也稱之為容器調度器。可以將它理解為一個資源隊列。資源隊列需要用戶自己分配。例如因為 Job 需要要把整個集群分成了AB兩個隊列,A隊列又可以繼續分,比如將A隊列再分為1和2兩個子隊列。那么隊列的分配就可以參考下面的樹形結構:

      —A[60%] ??|—A.1[40%] ??|—A.2[60%] —B[40%]

      上述的樹形結構可以理解為A隊列占用集群全部資源的60%,B隊列占用40%。A隊列又分為1,2兩個子隊列,A.1占據40%,A.2占據60%,也就是說此時A.1和A.2分別占用A隊列的40%和60%的資源。雖然此時已經對集群的資源進行了分配,但并不是說A提交了任務之后只能使用集群資源的60%,而B隊列的40%的資源處于空閑。只要是其它隊列中的資源處于空閑狀態,那么有任務提交的隊列就可以使用分配給空閑隊列的那些資源,使用的多少依據具體配置。參數的配置會在后文中提到。

      (1) 層次化的隊列設計,這種層次化的隊列設計保證了子隊列可以使用父隊列的全部資源。這樣通過層次化的管理可以更容易分配和限制資源的使用。

      (2) 容量,給隊列設置一個容量(資源占比),確保每個隊列不會占用集群的全部資源。

      (3) 安全,每個隊列都有嚴格的訪問控制。用戶只能向自己的隊列提交任務,不能修改或者訪問其他隊列的任務。

      (4) 彈性分配,可以將空閑資源分配給任何隊列。當多個隊列出現競爭的時候,則會按照比例進行平衡。

      (5) 多租戶租用,通過隊列的容量限制,多個用戶可以共享同一個集群,colleagues 保證每個隊列分配到自己的容量,并且提高利用率。

      (6) 可操作性,Yarn支持動態修改容量、權限等的分配,這些可以在運行時直接修改。還提供管理員界面,來顯示當前的隊列狀態。管理員可以在運行時添加隊列;但是不能刪除隊列。管理員還可以在運行時暫停某個隊列,這樣可以保證當前隊列在執行期間不會接收其他任務。如果一個隊列被設置成了stopped,那么就不能向他或者子隊列提交任務。

      (7) 基于資源的調度,以協調不同資源需求的應用程序,比如內存、CPU、磁盤等等。

      [譯]Hadoop Yarn上的調度器

      (1)?capacity:隊列的資源容量(百分比)。當系統非常繁忙時,應保證每個隊列的容量得到滿足,如果每個隊列應用程序較少,可與其他隊列共享剩余資源。注意,所有隊列的容量之和應小于100。

      (2)?maximum-capacity:隊列的資源使用上限(百分比)。由于資源共享,因此一個隊列使用的資源量可能超過其容量,可以通過該參數來限制最多使用資源量。(這也是前文提到的隊列可以占用資源的最大百分比)

      (3)?user-limit-factor:每個用戶最多可使用的資源量(百分比)。比如,如果該值為30,那么在任何時候每個用戶使用的資源量都不能超過該隊列容量的30%。

      (4)?maximum-applications?:集群中或者隊列中同時處于等待和運行狀態的應用程序數目上限(cluster or at the same time in a waiting in the queue and application number of the running condition limit),這是一個強限制,一旦集群中應用程序數目超過該上限,后續提交的應用程序將被拒絕,默認值為 10000。所有隊列的數目上限可通過參數?yarn.scheduler.capacity.maximum-applications?設置(可看做默認值),而單個隊列可通過參數?yarn.scheduler.capacity..maximum-applications?設置。

      (5)?maximum-am-resource-percent:集群中用于運行應用程序 ApplicationMaster 的最大資源比例,該參數通常用于限制處于活動狀態的應用程序數目。該參數類型為浮點型,默認是0.1,表示10%。所有隊列的 ApplicationMaster 資源比例上限可通過參數?yarn.scheduler.capacity. maximum-am-resource-percent?設置(可看做默認值),而單個隊列可通過參數?yarn.scheduler.capacity..maximum-am-resource-percent?設置。

      (6)?state?:隊列狀態可以為 STOPPED 或者 RUNNING,如果一個隊列處于 STOPPED 狀態,用戶不可以將應用程序提交到該隊列或者它的子隊列中,類似的,如果 ROOT 隊列處于 STOPPED 狀態,用戶不可以向集群中提交應用程序,但是處于 RUNNING 狀態的應用程序仍可以正常運行,以便隊列可以優雅地退出。

      (7)?acl_submit_applications:指定哪些Linux用戶/用戶組可向隊列提交應用程序。需要注意的是,該屬性具有繼承性,即如果一個用戶可以向某個隊列提交應用程序,那么它可以向它的所有子隊列提交應用程序。配置該屬性時,用戶之間或用戶組之間用?,?分割,用戶和用戶組之間用空格分割,比如?user1,user2 group1,group2。

      (8)?acl_administer_queue:指定隊列的管理員,管理員可控制該隊列的所有應用程序,例如殺死任意一個應用程序等。同樣,該屬性具有繼承性,如果一個用戶可以向某個隊列提交應用程序,則它可以向它的所有子隊列提交應用程序。

      4. Fair調度器

      上圖顯示了 Fair 調度器的實現(執行過程示意圖)。Fair 調度器也稱之為公平調度器。Fair 調度器是一種隊列資源分配方式,在整個時間線上,所有的 Job 平分資源。默認情況下,Fair 調度器只是對內存資源做公平的調度和分配。當集群中只有一個任務在運行時,那么此任務會占用集群的全部資源。當有其他的任務提交后,那些釋放的資源將會被分配給新的 Job,所以每個任務最終都能獲取幾乎一樣多的資源。

      Fair 調度器也可以在多個隊列上工作,如上圖所示,例如有兩個用戶A和B,他們分別擁有一個隊列。當A啟動一個 Job 而B沒有提交任何任務時,A會獲得集群全部資源;當B啟動一個 Job 后,A的任務會繼續運行,不過隊列A會慢慢釋放它的一些資源,一會兒之后兩個任務會各自獲得集群一半的資源。如果此時B再啟動第二個 Job 并且其它任務也還在運行時,那么它將會和B隊列中的的第一個 Job 共享隊列B的資源,也就是隊列B的兩個 Job 會分別使用集群四分之一的資源,而隊列A的 Job 仍然會使用集群一半的資源,結果就是集群的資源最終在兩個用戶之間平等的共享。

      (1)?yarn.scheduler.fair.allocation.file:?allocation?文件的位置,allocation?文件是一個用來描述隊列以及它們屬性的配置文件。這個文件必須為格式嚴格的xml文件。如果為相對路徑,那么將會在classpath下查找此文件(conf目錄下)。默認值為?fair-scheduler.xml。

      (2)?yarn.scheduler.fair.user-as-default-queue:如果沒有指定隊列名稱時,是否將與?allocation?有關的 username 作為默認的隊列名稱。如果設置成 false(且沒有指定隊列名稱) 或者沒有設定,所有的 jobs 將共享?default?隊列。默認值為 true。

      (3)?yarn.scheduler.fair.preemption:是否使用搶占模式(優先權,搶占),默認為 fasle,在此版本中此功能為測試性的。

      (4)?yarn.scheduler.fair.assignmultiple:是在允許在一個心跳中發送多個容器分配信息。默認值為 false。

      (5)?yarn.scheduler.fair.max.assign:如果?yarn.scheduler.fair.assignmultiple?為true,那么在一次心跳中最多發送分配容器的個數。默認為-1,無限制。

      (6)?yarn.scheduler.fair.locality.threshold.node:0~1之間一個float值,表示在等待獲取滿足?node-local?條件的容器時,最多放棄不滿足?node-local?的容器機會次數,放棄的nodes個數為集群的大小的比例。默認值為-1.0表示不放棄任何調度的機會。

      (7)?yarn.scheduler.fair.locality.threashod.rack:同上,滿足?rack-local。

      (8)?yarn.scheduler.fair.sizebaseweight:是否根據應用程序的大小(Job的個數)作為權重。默認為 false,如果為 true,那么復雜的應用程序會獲取更多的資源。

      5. 總結

      如果業務邏輯比較簡單或者剛接觸 Hadoop 的時建議使用 FIFO 調度器;如果需要控制部分應用程序的優先級,同時又想要充分利用集群資源的情況下,建議使用 Capacity 調度器;如果想要多用戶或者多隊列公平的共享集群資源,那么就選用Fair調度器。希望大家能夠根據業務所需選擇合適的調度器。

      原文:http://www.cobub.com/en/the-selection-and-use-of-hadoop-yarn-scheduler/

      Hadoop Yarn

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表格怎樣設置疊加圖表數據
      下一篇:工廠生產管理方法(工廠生產管理方法有哪些)
      相關文章
      国产成人亚洲精品| 国产精品亚洲高清一区二区| 亚洲精品国产美女久久久| 亚洲av再在线观看| 亚洲精品乱码久久久久久V| 久久精品国产亚洲av麻豆小说| 亚洲开心婷婷中文字幕| 国产a v无码专区亚洲av| 一级毛片直播亚洲| 亚洲А∨精品天堂在线| 亚洲高清最新av网站| 国产精品亚洲一区二区无码| 亚洲成a人片在线不卡一二三区| 亚洲最新黄色网址| 国产亚洲精品自在线观看| 久久精品国产亚洲Aⅴ香蕉| 国产成人综合亚洲| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲成年人电影网站| 亚洲综合色一区二区三区小说| 久久久久亚洲av无码尤物| 亚洲精品国精品久久99热一| 亚洲中文字幕第一页在线| 久久亚洲色一区二区三区| 亚洲国产精品综合久久网络| 日韩精品亚洲专区在线影视| 黑人粗长大战亚洲女2021国产精品成人免费视频| 精品日韩99亚洲的在线发布| 亚洲熟妇无码久久精品| 亚洲美女一区二区三区| 亚洲色图校园春色| 亚洲日本精品一区二区| 久久久久亚洲Av无码专| 青青草原精品国产亚洲av| 青青草原亚洲视频| 亚洲无线码在线一区观看| 亚洲人成网站在线观看青青| 亚洲男人的天堂网站| 国产在亚洲线视频观看| 亚洲äv永久无码精品天堂久久 | 亚洲视频在线免费|