在具體分析原始碼之前,我們先看看yarn是如何定義乙個事件的。比如作業啟動的事件,很多人可能會用常量將它定義到乙個class檔案中,就像下面這樣:
class constants
或者簡單的使用列舉,就像下面這樣;
enum enums
}
之後,當增加了作業停止的事件,**會變為:
class constants
或者:
enum enums
}
我們的系統往往很複雜,這時候引入了任務的概念,包括任務啟動、任務停止的事件。隨著業務發展,有更多的概念被加進來,就像下面這樣;
class constants
或者:
enum enums
}
當加入的常量值越來越多時,你會發現以上使用方式越來越不可維護。各種概念混雜在一起,顯得雜亂無章。你可能會說,我不會這麼傻,我會將作業與任務以及其它概念的常量值分而治之,每個業務概念相關的放入乙個檔案,就像下面這樣:
class jobconstants
class taskconstants
或者:
enum jobenums
}enum taskenums
}
現在業務出現了新的變化,每種列舉值除了name屬性之外,還增加了code屬性。假如你之前選擇了常量值來實現,此時不可避免的需要重構。如果你選擇了列舉,說明你初步的選擇是明智的,你可以這樣來擴充套件:
enum jobenums
}enum taskenums
}
可悲的是,你不得不在每乙個列舉中都重複加入類似的**。也許你認為這只不過是增加些許的工作量,你操作鍵盤的手法熟練而迷人,幾次快速的複製操作就可以完成。噩夢遠沒有結束,新的需求給兩個列舉型別融入了新的不同——jobenums增加了description屬性,而taskenums則增加了timestamp欄位。此外,兩者還必須都增加hashcode方法以用於雜湊。增加這些功能後,**將變為:
enum jobenums
public int hashcode()
}enum taskenums
public int hashcode()
}
隨著業務的發展,你會發現你需要維護的列舉型別差異越來越多。即便它們之間有所不同,可是卻有很多內容是重複的。為了解決列舉與常量在可讀性、可維護性、可復用性、可擴充套件性等方面的問題,hadoop將事件進行了以下定義:
事件 = 事件名稱 + 事件型別
比如作業啟動事件 = 作業事件 + 作業事件型別
/**
* inte***ce defining events api.
* */
@public
@evolving
public inte***ce event>
以上介面說明了任何乙個具體事件都是乙個列舉型別,而且有乙個事件型別屬性(用泛型標記type表示),乙個時間戳及tostring()方法。
所有事件都有乙個基本實現abstractevent,其實現如下:
/**
* parent class of all the events. all events extend this class.
*/@public
@evolving
public abstract class abstractevent>
implements event
// use this if you care about the timestamp
public abstractevent(type type, long timestamp)
@override
public long gettimestamp()
@override
public type gettype()
@override
public string tostring()
}
以jobevent表示作業事件,其實現如下:
/**
* this class encapsulates job related events.
* */
public class jobevent extends abstractevent
public jobid getjobid()
}
taskevent表示任務事件,其實現如下:
/**
* this class encapsulates task related events.
* */
public class taskevent extends abstractevent
public taskid gettaskid()
}
事件型別屬性(用泛型標記type表示)在任務事件中對應的是taskeventtype,其實現如下:
/**
* event types handled by task.
*/public enum taskeventtype
jobeventtype類似,不再贅述。
這種實現將列舉與各種事件之間的差異(表現在屬性和方法的不同)解耦,極大地擴充套件了可讀性、可維護性,並且保留了相同邏輯的**復用。
後記:個人總結整理的《深入理解spark:核心思想與原始碼分析》一書現在已經正式出版上市,目前京東、噹噹、天貓等**均有銷售,歡迎感興趣的同學購買。
京東(現有滿150減50活動)):
噹噹:
js事件的分類和介紹
1 常用window事件 window.onload onscroll.function load事件 unload事件 頁面載入時生效 scroll事件 頁面滾動時生效 2 常用滑鼠事件 box.onclick onmouseover.function click事件 單擊 dbclick事件 雙...
Storm與Hadoop的比較
對於一堆時刻在增長的資料,如果要統計,可以採用什麼方法呢?1.等資料增長到一定程度的時候,跑乙個統計程式進行統計。適用於實時性要求不高的場景。如將資料匯入到hdfs,再執行乙個map reduce job。2.如果實時性要求高的,上面的方法就不行了。因此就帶來第二種方法。在資料每次增長一筆的時候,就...
MPI與Hadoop的區別
1.hadoop與mpi的主要區別體現在資料儲存和資料處理在系統中位置不同。mpi是計算與儲存分離,hadoop是計算向儲存遷移。這一點體現出,hadoop系統中資料儲存的位置更重要。mpi是一種基於訊息傳遞機制的並行程式設計標準,它為程式設計者提供了豐富而方便的通訊函式,在程式設計上非常簡單而且符...