[hadoop] hadoop二次開發 閱讀源碼

學習目標

  1. hadoopRPC實現原理
  2. namenode工作原理
  3. datanade工作原理

RPC:

1.客戶端調用服務端的方法,

2.服務端初始化的時候會創建一個死循環的進程,供客戶端調用

3.RPC :Remote Procedure Call 不同進程間方法的調用

4.Hadoop RPC: 不同進程的方法的調用

5.http也是一種RPC:可以實現不同進程的方法的調用

實例:

#服務端
Server server =new RPC.Builder(new Configuration())
		.setBindAddress("localhost")
		.setPort(9999)
		.setProtocol(ClientProtocol.class)
		.setInstance(new NameNodeRpcServer())
		.build();
		/**
		 * 這樣的話,就把服務給啓動起來了
		 * 服務啓動起來了以後,等待別人的調用。
		 */
		server.start();


#客戶端
   
//獲取服務端的代理
		ClientProtocol namenode= RPC.getProxy(
				ClientProtocol.class,
				1234L, 
				new InetSocketAddress("localhost", 9999) , new Configuration());
		//通過這個代理去調用服務端的代碼
		namenode.mkdirPath("/usr/local/host");

RPC總結:

  1. 不同進程的方法的調用
  2. RPC 分爲客戶端和服務端,客戶端調用服務端的方法。方法的執行是在服務端
  3. 其實我們裏面一直說的協議其實說白了就是一個接口 但是這個接口有個要求,裏面必須要有versionID
  4. 協議裏面會很多抽象方法,裏面的抽象方法由服務端來去實現。 或者說,誰實現了這些抽象方法,誰就是服務端。

namenode啓動流程

Rpc初始化

1.namenode初始化的時候會創建兩個httpserver,分別是serviceRpcserver和clientRpcserver

2.每個httpserver會綁定多個service,每個service會綁定多個協議

3.serviceRpcserve主要服務內部(namenode元數據管理和datanode),clientRpcserver主要響應客戶端(clientRpc調用)

4.客戶端代用操作服務端的namedemo方法的協議

公共服務初始化

1.進行資源檢查,檢查磁盤資源是否足夠存儲元數據 hadoop-deamon.sh start namenode  >100M

2.會檢查三個目錄 namenode的存儲fsimage目錄,editlog目錄;journlanode也有存儲元數據的目錄

3 初始化FsNameSystem的blockmanager,leasemanager,safemodeinfo和fsimage對象

4.fsimage持久化到磁盤的鏡像文件,保證hfds高可用,數據持久化到磁盤,雙緩衝機制

5.進入安全模式檢查,檢查是否可以退出安全模式

6.blockmanager,leasemanager計算block的個數閾值,是否小於閾值進入安全模式

7.safemodeinfo 記錄存活的datanode個數 live datanode是否大於0 進入安全模式

8.通過設置block的閾值,來配置進入安全模式的規則

9.啓動namenode服務,接着啓動datanode

 

datanode初始化

1.實例化DataXserviceServer ,用來接收客戶端和其他datanode傳過來的數據,並設置爲後臺線程

2.啓動httpServer,綁定了多個servlet,用來接收http的請求,主要用於內部的namenode和datanode的傳輸

3.啓動Rpc服務端,綁定多個service,每個service綁定多個協議

4.初始化blockpoolManager,用於管理block和datanode心跳機制

5.遍歷聯邦,一個聯邦就是一個nameservice(每個聯邦裏會有多個HA架構,一個HA架構有兩個namenode,兩個namenode 對應一個namespace命名空間)

6.遍歷創建BPOfferService(namespace),一個BPOfferService對應兩個BPserviceActor(namenode)

7.dataStorage,datanade的數據存儲

8.完成初始化

datanode註冊發送心跳

datanade註冊

1.遍歷BPOfferService (namespace)命名空間中的BPserviceActor 獲得nadenode的信息

2.調用NamenadeRpc驗證VersionRequest是否正確

3.啓動datanade的註冊線程,將datanade註冊到namenode上:

1)獲取namenode的代理,調用namenode的方法,往namenode傳輸datanade信息(地址,端口號等)

2)調用namnode的 registerDatanade 的方法,往nodenade上註冊信息:

3)註冊datanode,往一堆數據結構裏添加信息

4)註冊結束,發送心跳

datanade 發送心跳

1.每三秒發送一次心跳,返回namenode的響應指令(datanode和namenode不直接進行連接,通過心跳的方式獲取namenode的指令)

2.調用namenode的方法發送心跳:告訴namenode 有哪些datanade信息(datanade狀態,資源等)

3.namenode接收心跳,處理髮送過來的心跳信息,並返回響應的指令給datanade

4.namenode獲取datanode信息,更新datanode的心跳狀態和存儲數據,修改上一次的心跳時間

5.namenode通過心跳判斷一個datanode是否存活,用當前心跳時間減去上一次的心跳時間超過閾值,判斷datanode是否存活

Hdfs 初始化上傳

目的:上傳文件,查看hdfs上傳文件的流程

初始化:

添加元數據

1.客戶端使用Rpc代理 調用 namenodeRpcserver創建Fsnamesystem

2.Fsnamesystem調用FSdirectory方法在 目錄樹的子目錄下掛載文件

3.hdfs爲了保證元數據的安全性會將數據持久化到磁盤,調用FSeditlog,使用雙緩衝,磁盤交換機制,在幾乎不影響性能的情況下實現元數據持久化到磁盤

添加契約

1.Fsnamesystem 啓動LeaseManager(契約管理者)並在各種數據結構中添加契約

2. LeaseManager 管理 契約的生存週期,每隔2秒檢查寫入的數據是否符合添加的契約,就是檢查是否有寫入的權限,寫入的數據不符合契約沒有權限,LeaseManager會釋放契約,還會檢查契約是否超過一小時,也會釋放。

3.啓動完LeaseManager 契約管理者,客戶端會每隔30s使用LaseRenewer調用Rpc服務端 通過Fsnamesystem續約一次,就是心跳機制,每隔30s客戶端向服務端更新一個服務端上契約的過期時間。

正式上傳

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章