深入理解 Hadoop (一)網(wǎng)絡(luò)通信架構(gòu)與源碼淺析
深入理解 Hadoop (二)HDFS架構(gòu)演進(jìn)
深入理解 Hadoop (三)HDFS文件系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)
深入理解 Hadoop (四)HDFS源碼剖析
深入理解 Hadoop (五)YARN核心工作機(jī)制淺析
深入理解 Hadoop (六)YARN核心設(shè)計(jì)理念與工作流程剖析
深入理解 Hadoop (七)YARN資源管理和調(diào)度詳解
Hadoop RPC 網(wǎng)絡(luò)通信框架原理剖析
YARN RPC 服務(wù)端的工作大致可以分為四個(gè)階段:
第一個(gè)階段: Server 初始化和啟動
在 Server 初始化的時(shí)候,會初始化 Listener 組件(內(nèi)部啟動了一個(gè) AcceptSelector 綁定了相應(yīng)的端口,用來處理客戶端的 OP_ACCEPT 事件),內(nèi)部還初始化了一組 Reader 線程,其實(shí)就是啟動了 ReaderSelector,用來處理 OP_READ 事件。還啟動一個(gè) Responder 線程用來處理響應(yīng)。
在 Server 調(diào)用 start() 方法啟動的時(shí)候,啟動 Listener 線程 和 Responder 線程。然后還初始化了一組 Handler 線程,專門用來處理存儲在 callQueue 的 RpcCall 請求。
第二個(gè)階段: 接收請求,封裝 RpcCall
代碼入口就是 Listener 的 run() 方法接收來自各個(gè)客戶端的 RPC 請求,并將他們封裝成 RpcCall 類放到一個(gè)共享隊(duì)列 callQueue 中。再詳細(xì)點(diǎn),該過程可以分為建立鏈接和接受請求兩個(gè)階段,分 別由 Listener 和 Reader 兩種線程完成。
具體來講,首先 Listener 接受客戶端的請求,然后通過輪詢的方式從 Reader 中獲取一個(gè)線程用來處理 OP_READ 事件讀取 RPC 請求數(shù)據(jù),如果對應(yīng)客戶端有數(shù)據(jù)寫過來,則該 Reader 負(fù)責(zé)讀取數(shù)據(jù),然后封裝成 RpcCall 加入到 callQueue 隊(duì)列中等待 Handler 來執(zhí)行下一步 處理。
第三個(gè)階段: 處理 RpcCall 請求
Handler 從 callQueue 中獲取 RpcCall 來執(zhí)行處理,并執(zhí)行對應(yīng)的 Rpc 函數(shù)調(diào)用,將得到的結(jié)果返回給客戶端。
第四個(gè)階段: 返回結(jié)果
在 Server 內(nèi)部只有一個(gè) Responder 線程。它內(nèi)部的 WriteSelector 負(fù)責(zé)監(jiān)聽 OP_WRITE 事件。如果 Responder 并不能一次性將結(jié)果寫出去,就注冊 OP_WRITE 事件分多次異步寫。
Hadoop RPC 源碼分析
RPC 客戶端源碼分析
客戶端請求三層調(diào)用關(guān)系
// 1、proxy.method()
// 2、invoker.invoke()
// 3、client.call()
Hadoop RPC 客戶端的工作機(jī)制
當(dāng)我們獲取一個(gè)某個(gè)通信協(xié)議的代理對象的時(shí)候,我們可以通過這個(gè)代理對象和 Server 進(jìn)行通信,請求 Server 端的服務(wù) 客戶端獲取的代理對象內(nèi)部,是構(gòu)建一個(gè) Invoker,也就是一個(gè) InvocationHandler,當(dāng)發(fā)送 RPC 請求的時(shí)候,實(shí)際上,就會回調(diào)了 Invoker.invoke() 方法 Invoker 的內(nèi)部封裝了 Client,當(dāng)我們真的通過代理對象調(diào)用某個(gè)方法的時(shí)候,實(shí)際上,底層是通過 Client.call() 發(fā)送一個(gè) RPC 請求給服務(wù)端,再獲取到結(jié)果 Call 方法的具體實(shí)現(xiàn),分為四步走:
第一步: 構(gòu)建 Call 對象
第二步: 構(gòu)建 Connection 鏈接對象,實(shí)際上內(nèi)部維護(hù)了一個(gè) Socket 客戶端
第三步: 通過 Connection 發(fā)送 RPC 請求到服務(wù)端,并且把獲取到的結(jié)果設(shè)置到 Call 對象的 rpcResponse 成員變量上
第四步: 從 Call 上獲取 RPC 執(zhí)行結(jié)果
RPC 服務(wù)端源碼分析
Key - Connection - Channel 一一對應(yīng), Connection 又會封裝在 Call 之中。調(diào)用過程如下如所示:
HDFS RPC 通信協(xié)議整理
ClientProtocol(Client -> NameNode) Client 和 NameNode 之間的通信協(xié)議,DFSClient 通過這個(gè)協(xié)議可以操縱HDFS的目錄命名空間、打開與關(guān)閉文件流,比如向 NameNode 發(fā)送 RPC 請求創(chuàng)建文件夾,刪除文件等等。
DatanodeProtocol(NameNode -> DataNode) NameNode 和 DataNode之間的通信協(xié)議,DataNode 通過此協(xié)議向 NameNode 注冊,心跳,塊匯報(bào)等。
ClientDatanodeProtocol(Client -> DataNode) Client 和 DataNode之間的通信協(xié)議,用來進(jìn)行塊恢復(fù)。
InterDatanodeProtocol(DataNode -> DataNode) DataNode 和 DataNode 之間的通信協(xié)議,該協(xié)議用于Datanode 進(jìn)程之間進(jìn)行通信。
NamenodeProtocol(NameNode -> SecondaryNameNode) NameNode 和 SecondaryNameNode 之間的通信協(xié)議,負(fù)責(zé)進(jìn)行 checkpoint 相關(guān)工作的交互。
DataTransferProtocol(DataNode -> DataNode) DataNode 和 DataNode 之間的通信協(xié)議,負(fù)責(zé)進(jìn)行 DataNode 相互之間的數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議。文章來源:http://www.zghlxwxcb.cn/news/detail-778337.html
YARN RPC 通信協(xié)議整理
ApplicationClientProtocol(Client -> RM) clients 與 RM 之間的協(xié)議, JobClient 通過該 RPC 協(xié)議提交應(yīng)用程序、 查詢應(yīng)用程序狀態(tài)等。
ResourceTracker(NM -> RM) NM 與 RM 之間的協(xié)議, NM 通過該 RPC 協(xié)議向 RM 注冊, 并定時(shí)發(fā)送心跳信息匯報(bào)當(dāng)前節(jié)點(diǎn)的資源使用情況和 Container 運(yùn)行情況。
ApplicationMasterProtocol(AM -> RM) AM 與 RM 之間的協(xié)議, AM 通過該 RPC 協(xié)議向 RM 注冊和撤銷自己, 并為各個(gè)任務(wù)申請資源。
ContainerManagementProtocol(AM -> NM) AM 與 NM 之間的協(xié)議, AM 通過該 RPC 要求 NM 啟動或者停止 Container, 獲取各個(gè) Container 的使用狀態(tài)等信息。
ResourceManagerAdministrationProtocol(RM Admin -> RM) Admin 與 RM 之間的通信協(xié)議, Admin 通過該 RPC 協(xié)議更新系統(tǒng)配置文件, 例如節(jié)點(diǎn)黑白名單等。
HAServiceProtocol(Active RM HA Framework Standby RM) Active RM 和 Standby RM 之間的通信協(xié)議,提供狀態(tài)監(jiān)控和 fail over 的 HA 服務(wù)。
TaskUmbilicalProtocol(YarnChild -> MRAppMaster) YarnChild 和 MRAppMaster 之間的通信協(xié)議,用于 MRAppMaster 監(jiān)控跟蹤 YarnChild 的運(yùn)行狀態(tài),YarnChild 向 MRAppMaster 拉取 Task 任務(wù)信息。
MRClientProtocol(JobClient -> ApplicationMaster) JobClient 和 ApplicationMaster 之間的通信協(xié)議。用于客戶端拉取 Application 的執(zhí)行狀態(tài),以及 Application 返回執(zhí)行結(jié)果給 客戶端。文章來源地址http://www.zghlxwxcb.cn/news/detail-778337.html
到了這里,關(guān)于深入理解 Hadoop (一)網(wǎng)絡(luò)通信架構(gòu)與源碼淺析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!