yarn和ha從進入到放棄

2021-10-14 13:47:40 字數 1362 閱讀 2768

2 總結

本人主動放棄yarn和ha的解析,不是因為看不懂原始碼,而是因為不能進行除錯.如果不能進行除錯,就總感覺離真實的情況有些模糊的距離,這不是閱讀原始碼的初衷.在閱讀yarn和ha的原始碼時,發現了這麼乙個除錯的問題,除錯原始碼的難度大到不可實行,即使使用原始碼中已有的測試類,也無法達到閱讀真實原始碼的目的,下文會詳細的說明.

yarn和ha的除錯問題並不完全相同.

主要問題是狀態機的除錯和rpc的除錯.

yarn的resourcemanager有四種狀態機,每個都極其複雜,狀態被儲存在zk上,在除錯時的主要問題有:

1 每個轉態機的dispatcher不同,幾乎要把每個dispatcher的每個方法都打上斷點,這麼做除錯起來太難.

2 使用rpc實現邏輯節藕,同時大量使用執行緒和執行緒池,效果就是從邏輯節藕變為了物理節藕,不同的邏輯在不同的執行緒中執行,這使得除錯的難度劇增.

yarn的這些狀態機可以參考該文章:

主要問題是不能接觸到真實的原始碼和rpc除錯.

ha整體不涉及狀態機的問題,但是其涉及到zk的leader選舉和諸多rpc的呼叫,個人認為這裡使用的rpc及啟動的執行緒比yarn還多.

1 測試類沒有使用原始碼的邏輯,而是使用了mock技術,攔截了真實原始碼的邏輯,這一點和namenode機datanode不同,它們都使用了真實的原始碼.

在實現故障轉移時,使用的是mockhaprotocalimpl類,此類在方法上做了攔截,沒有使用真實原始碼的邏輯:

實際使用的類是mock的攔截類,方法上也註解了攔截.

2 rpc及執行緒巨多,除錯難度巨大.

這是一小段方法的截圖

這個start方法一共10行,有4行都是在起執行緒,其中兩行還是在for迴圈中起執行緒.起的執行緒多倒沒什麼,都是同一類的,但是種類就有四種,**的其它地方還有類似的不同類的執行緒啟動.如果除錯,基本就是對每乙個run方法設定斷點,同yarn類似,造成除錯難度劇增.

關於yarn和ha的除錯,進入後只需要半天的時間就能找到足夠多的理由放棄.總結起來,這也與hadoop的設計理念和實現方式有關.這種大型的軟體設計上肯定首先考慮的是功能模組的節藕,其次是實現方式要夠靈活,要為之後的改動留下足夠多的空間.

所以在本人看來,hadoop不僅實現了邏輯上的節藕,同時幾乎實現了物理計算的節藕,以執行緒為單位隔離不同的功能邏輯,通過rpc來串聯這些執行緒的執行,目前看這是成功的.

SFML從入門到放棄 1 視窗和互動

sf renderwindow window sf videomode 500,500 new window 但是光建立乙個視窗並不能顯示 還要加乙個迴圈 while window.isopen 然後就能看到乙個黑色的視窗了 event是乙個union 可以通過 event.type 來判斷 具體可...

JS從入門到放棄 基本型別和引用型別

js有number,string,null,undefined,boolean,array,object七種資料型別,而js的變數,根據指向資料型別的不同,也分為兩種型別,一種基本型別,一種引用型別.1.基本型別 基本型別包括 number,string,null,undefined,boolean...

C 從入門到放棄之 類和物件基本認知

struct class 類名 繼承方式 基類,建構函式 類名 void 析構函式 返回值型別 函式名 形參表 成員函式 資料型別 m 變數名 成員函式 public 公有成員 在任何位置都可以訪問,類的內部和外部都可以訪問 private 私有成員 只有類的內部成員才可以訪問,不可以通過類的物件直...