在yarn的服務元件中,其resourcemanager和nodemanager上擁有多個服務並對外提供,並且resourcemanager和nodemanager上需要響應各種客戶端的併發請求,以及其內部維護的任務和資源狀態流轉。所以在resourcemanager和nodemanager的源**設計中,其採用了基於服務庫的管理程式設計模型以及基於非同步事件驅動排程的併發模型。接下來分析下這兩種程式設計模式:
在yarn中,其對生命週期較長並需對外提供服務的物件,採用了基於服務的物件管理模型對其進行管理,該模型主要有以下幾個特點:
將每個被服務化的物件分為4個狀態:notinited(被建立)、inited(已初始化)、started(已啟動)、stopped(已停止)
任何服務狀態變化都可以觸發另外一些動作
可通過組合的方式對任意服務進行組合,以便進行統一管理
yarn中採用了基於事件驅動的非同步併發模型,該模型能夠大大增強併發性,從而提高系統整體效能。為了構建該模型,yarn將各種處理邏輯抽象成事件和對應事件排程器,並將每類事件的處理過程分割成多個步驟,用有限狀態機表示。yarn中的事件處理模型可概括為圖所示。
整個處理過程大致為:處理請求會作為事件進入系統,由**非同步排程器(asyncdispatcher)負責傳遞給相應事件排程器(event handler)。該事件排程器可能將該事件**給另外乙個事件排程器,也可能交給乙個帶有有限狀態機的事件處理器,其處理結果也以事件的形式輸出給**非同步排程器。而新的事件會再次被**非同步排程器**給下乙個事件排程器,直至處理完成(達到終止條件)。
服務化和事件驅動軟體設計思想的引入,使得yarn具有低耦合、高內聚的特點,各個模組只需完成各自功能,而模組之間則採用事件聯絡起來,系統設計簡單且維護方便。
1)定義task事件
public class taskevent extends abstractevent
public string gettaskid()
}其中, task事件型別定義如下:
public enum taskeventtype
2)定義job事件
public class jobevent extends abstractevent
public string getjobid()
} 其中,job事件型別定義如下:
public enum jobeventtype
3)事件排程器接下來定義乙個**非同步排程器,它接收job和task兩種型別事件,並交給對應的事件處理器處理,**如下:
private dispatcher dispatcher; //**非同步排程器
private string jobid;
private int tasknumber; //作業中包含的任務數
private string taskids; //該作業中包含的所有任務
super(name);
this.jobid = jobid;
this.tasknumber = tasknumber;
this.taskids = new string[tasknumber];
for(int i = 0; i < tasknumber; i++)
} @override
protected void serviceinit(configuration conf) throws exception
public dispatcher getdispatcher()
private class jobeventhandller implements eventhandler
}else if(event.gettype()== jobeventtype.job_init)}}
}
private class taskeventhandller implements eventhandlerelse if(event.gettype()==taskeventtype.t_schedule)}}}
4)測試程式
相比於基於函式呼叫的程式設計模型,這種程式設計方式具有非同步、併發等特點,更加高效,因此更適合大型分布式系統。
YARN 的服務庫和事件庫及其使用
yarn採用了基於事件驅動的併發模型,該模型能夠大大增強併發性,從而提高系統整體效能。為了構件模型,yarn將各種處理邏輯抽象成事件和對應事件排程器,並將每類事件的處理過程分割成多個步驟,用有限狀態機表示。yarn中的事件處理模型可概括為下圖所示。整個處理過程大致為 處理請求會作為事件進入系統,由 ...
事件模型和標準庫
監聽函式 監聽函式是事件發生時,程式所要執行的函式。它是事件驅動程式設計模式的主要程式設計方式。在dom中提供三種方法為事件繫結監聽函式。html標籤的on 屬性 html語言允許在元素標籤的屬性中,直接定義某些事件的監聽 事件型別的種類 滑鼠事件 事件冒泡和捕獲 滑鼠事件 click事件 dblc...
4 2 標準庫 日期和事件
coding utf 8 日曆表 import calendar from calendar import calendar as ca 判斷是否是閏年 print calendar.isleap 2015 print calendar.isleap 2016 兩個年份間 y1,y2 閏年總數 pr...