詹文濤+艾中良+劉忠麟+李常寶+高澤



摘要:提交到YARN上的一個大數據作業會被切分為一個或者多個任務,任務是大數據作業申請資源和執行的基本單位。在某些領域中存在需要對作業緊急度作有效區分使得高緊急度作業優先獲得資源的需求,但是在現有的YARN資源調度策略中,對于提交到YARN上的高優先級作業缺乏資源優先分配和高質量的資源保障機制。本文在修改YARN原有資源調度方案的基礎上,提出了一種基于YARN的高優先級作業調度實現方案。實驗表明,提交到YARN上的高優先級作業執行效率提升了7%左右,證明設計方案行之有效。
關鍵詞:YARN;作業調度;高優先級
中圖分類號:TP391 文獻標識碼:A DOI:10.3969/j.issn.1003-6970.2016.03.021
0引言
YARN分布式大數據資源調度框架用于給運行于其上的作業調度資源并管理作業執行流程。現有的作業調度方案是以將作業分配給有空閑資源的節點為唯一目標的。在某些領域中存在需要對作業緊急度作有效區分使得高緊急度作業優先獲得調度資源的需求,在實際調研和使用中發現已有的YARN資源調度方案并不能很好的滿足這一需求。本文提出了一種YARN上的高優先級作業調度方案,通過將作業提交到自定義的高優先級隊列上,在資源調度過程中優先為高優先級作業分配資源,并避免當高優先級作業運行時,低優先級作業對其形成的資源競爭,實現了在集群負載較高情況下高優先級作業的執行效率提升。
1現有的YARN作業調度方案
對于YARN資源調度平臺而言,按照現在的調度方案,當有一個緊急度比較高的任務提交到處理平臺時,會提交到相應的調度隊列上,由中心調度器處理。中心調度器選中將要為其分配任務的目標節點、遍歷調度隊列的層級隊列樹選擇隊列,給選中隊列分配節點上的資源。對于隊列上待分配資源的作業集合,首先按照作業提交先進先出的順序分配節點上的資源,在同一個作業的多個任務中,為了控制任務執行順序,給資源請求一個優先級屬性,使得優先級高的任務能夠優先獲得資源。
這種作業調度方案對于作業整體而言缺乏一個作業層面的整體保障,使得不同作業之間調度緊急性缺乏一個有效的區分,同時有高緊急度作業提交到YARN上,無法避免當節點上運行有高優先級任務時普通任務對高優先級作業形成的資源競爭。
因此,需求為:保障當集群中提交有高優先級作業時,高優先作業優先獲得集群資源,使其能夠更快的獲得資源分配;保障當一個普通作業提交到目標節點上時,如果目標節點運行有高優先級任務,限制低優先級任務分配可用資源量,以使得高優先級任務能夠更好的運行。
2高優先級作業調度設計與實現
2.1實現思路
高優先級作業優先調度的設計方案是基于Capacity資源調度器實現的,本課題的開展按照以下步驟進行:
高優先級作業描述和解析。中心調度器是一個可插拔組件,可采用定義配置文件的方式給調度器配置相關參數。本課題設計為,給隊列一個優先級屬性,使得提交到該隊列上的作業優先調度分配資源。并且給隊列一個資源閾值屬性,使得提交到該隊列的任務能夠參考該閾值屬性,確定是否需要限制節點可分配資源量。并修改Web界面中對任務隊列描述部分參數。
在對高優先級隊列進行描述的基礎上,設計高優先級作業資源分配流程。流程如下:
選擇任務調度的目標節點。中心調度器保存了集群上所有節點及其資源量信息,該過程為選中節點集合中待為該節點分配作業的目標節點。
給高優先級隊列上任務優先分配資源。在選擇好目標節點后,本步驟為在高優先級隊列已經定義過,并且作業提交到高優先級隊列上時,設計先為高優先級隊列上的作業分配節點上資源后為普通隊列上的任務分配資源。
節點上運行有高優先級任務時,給普通任務添加閾值限制。一個節點上會同時運行不同作業的任務,當節點上有高優先級任務時,保障優先級任務的資源質量。
2.2實現方案
本課題設計的YARN高優先級作業調度模塊圖如圖l所示:
其中陰影部分模塊為添加或者修改過的模塊,功能如下。
調度器配置:是管理員用戶使用調度處理器的對外接口,用以配置調度器中集群上資源的組織方式,包括層級隊列的結構,隊列可使用資源量,用戶提交權限等信息。
Web界面:Hadoop YARN提供了一個可視化的web界面,用以實時監測隊列中資源使用信息,隊列資源相關的參數。
資源層級隊列:其中隊列分為父隊列和葉子隊列兩種,隊列基本信息包括從配置文件中解析到的信息和任務提交時作業集合信息,以及NodeManager注冊和心跳過程中更新的集群中資源量信息等。
作業調度處理器:作業調度器同時也是一個作業調度處理器,不同的調度事件類型觸發不同的行為,包括NODE_ADDED,NODE_REMOVED,NODE RESOURCE_UPDATE,NODE_UPDATE,APP_ADDED等。NODE_UPDATE事件觸發資源調度分配過程,是高優先作業調度的執行入口。
作業分配:對于調度處理器中已經分配好的作業,放在一個數據結構中,由AppplciationMaster主動拉取。
高優先級作業調度策略的實現按照如下步驟進行。
高優先級作業描述和解析。
1.隊列描述共涉及到如下類或者接口:
CSQueue接口是隊列通用方法描述接口,添加getPSThreshold、isPrior方法。AbstractCSQueue抽象類,定義葉子節點和非葉子隊列共有的方法。
LeafOueue繼承了AbstractCSQueue類,添加psthreshold、isPrior屬性。實現CSQueue接口中方法。
ParentQueue繼承了AbstractCSQueue類,實現CSQueue接口中方法。
2.隊列解析,共涉及到如下類或接口。CapacityScheduler類,將配置文件中隊列描述映射為配置文件對象。共涉及到如下方法:initializeQueues,初始化配置文件中定義的隊列,轉換為iava對象;initializeQueueMappings,檢驗隊列的合法性;parseQueue,遞歸解析隊列并判斷某一個隊列是否為高優先級隊列,并修改高優先級隊列可用容量為集群總容量,保存在CapacityScheduler屬性里。隊列解析流程如下:
(1)選擇任務調度的目標節點。中心調度器選擇目標節點有兩種方案,第一種方案與心跳協議相關,發送心跳消息的節點為目標節點;第二種方案按照節點列表的順序選擇目標節點。因此第二種方案存在選擇目標節點的流程,CapacityScheduler類中schedule方法實現了選擇目標節點邏輯。
YARN web界面中相應的修改,主要涉及到如下類和方法:CapacitySchedulerPage類中render方法。CapacitySchedulerLeafOueuelnfo類中添加getPSTheshold、isPrior方法,這部分類圖調用關系如下:
(2)給高優先隊列上任務優先分配資源。涉及到CapacitySchedule類中priorAllocateContainersTo-Node函數,其代碼流程圖如下:
(3)節點運行有高優先級任務時,給普通任務添加閾值限制。主要涉及到CapacitySchedule類中allocateContainersToNode方法,為第三步中流程的一個子流程,細分如下:
以上是高優先級作業調度的實現方案的整個過程。這種設計方案的好處是,保持YARN對外接口一致性,兼容了YARN本身的資源調度策略,在此基礎上添加相關配置參數即可使用。
3實驗驗證與性能分析
本課題實驗環境搭建如下,共有4臺服務器,一臺普通計算節點??捎觅Y源配置如下:
搭建hadoop集群環境,修改capacity-sched-uler.xml隊列描述,給集群配置三個子隊列,分別為:
實驗測試實例一為wordcount,數據集為8.3G;實例二為pi 100 100。以下為功能驗證和性能驗證。
3.1功能驗證
高優先級作業優先調度部分驗證功能點如下:(1)對高優先級作業的描述和解析,即對隊列屬性描述的實現;(2)在集群負載比較滿的情況下,高優先級作業優先獲得資源并調度運行。因此實驗驗證也分兩部分進行,其中(1)可從啟動時HadoopYARN界面中隊列相關的屬性展示驗證,(2)需要進一步設計相關的實驗。
啟動YARN后,訪問Hadoop YARN界面,查看隊列定義部分功能,界面顯示如下:
圖中參數描述顯示root隊列下共有兩個子隊列default與prod。配置default為普通隊列,資源閾值為0.8;prod為優先級隊列,資源閾值為1,可用資源量為100%,即集群資源量。功能要點(1)驗證成功。
功能要點(2)實驗設計思路如下:利用集群單節點資源量有限,提交較大任務,造成節點資源占滿的情況,再向高優先級隊列中提交任務,記錄相關數據。詳細設計為:在同一個節點,先向default普通隊列上提交一個任務,在任務運行過程中向prod優先級隊列提交另一個相同任務。實驗過程如下:
分別提交作業1、2、3.作業執行情況數據匯總如下:
記錄作業1更加詳細的執行情況:
分析以上實驗數據,得出如下結論:
1.由表3可知:作業提交時間為1<2<3,作業執行完成時間為2<3<1,其中1為普通隊列上的作業,2、3為優先級隊列上的作業。即在集群負載滿情況下,任務隊列中同時有高低優先級作業時,高優先級作業優先調度完成。
2.對照表3和4可知:在執行普通作業的過程中提交高優先級作業,此時普通作業暫停執行,直到高優先級作業執行完畢后,普通作業重新開始調度執行。這是因為在集群負載較滿情況下,高優先級作業優先分配資源。
綜上說明了提交到高優先級隊列上的作業優先調度執行,功能點(2)驗證成功。
3.2性能分析
本課題的性能分析設計為:在集群閑置情況下測試實例執行時間,實例一執行時間為10分鐘左右,實例二執行時間為3分鐘左右。設計分兩個過程進行:
過程1:先向default隊列提交1個作業,再向food隊列提交1個作業,使集群資源負載占滿,作業選擇實例1,在任務執行過程中再向prod隊列提交3個作業,記錄prod隊列上作業從提交到運行結束時間,作業選擇實例2。
過程2:先向defaulf隊列提交1個作業,在任務執行過程中再向food隊列提交1個作業,使集群負載占滿,作業選擇實例1,在任務執行過程中再向food隊列提交3個作業,記錄food隊列上后提交三個任務從提交到運行結束時間,作業選擇實例2。
重復三次,取均值。實驗記錄為:
由表5可知:在運行有較大任務將集群資源占滿的情況下,提交高優先級作業,高優先級作業能立即開始執行。
綜上所述,本課題中設計的資源調度方案,成功實現了高優先級作業優先調度,并提升了在集群負載較滿的情況下高緊急度作業執行效率,效率提升為(359.7-336.7)/336.7≈7%。
4結論
本文實現了一種基于YARN的高優先級作業調度方案,解決了在某些領域中需要區分作業緊急度,實現高緊急度作業優先調度資源并保障資源質量的問題,實驗證明該方案提升了高緊急度作業的執行效率。