學習目標
- hadoopRPC實現原理
- namenode工作原理
- 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總結:
- 不同進程的方法的調用
- RPC 分爲客戶端和服務端,客戶端調用服務端的方法。方法的執行是在服務端
- 其實我們裏面一直說的協議其實說白了就是一個接口 但是這個接口有個要求,裏面必須要有versionID
- 協議裏面會很多抽象方法,裏面的抽象方法由服務端來去實現。 或者說,誰實現了這些抽象方法,誰就是服務端。
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客戶端向服務端更新一個服務端上契約的過期時間。
正式上傳