Hadoop2 6 0的事件分類與實現

2021-09-23 21:10:54 字數 3049 閱讀 4527

在具體分析原始碼之前,我們先看看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是一種基於訊息傳遞機制的並行程式設計標準,它為程式設計者提供了豐富而方便的通訊函式,在程式設計上非常簡單而且符...