Spark作為分布式計(jì)算框架,多個(gè)節(jié)點(diǎn)的設(shè)計(jì)與相互通信模式是其重要的組成部分。
一、組件概覽
對(duì)源碼分析,對(duì)于設(shè)計(jì)思路理解如下:
RpcEndpoint:RPC端點(diǎn) ,Spark針對(duì)于每個(gè)節(jié)點(diǎn)(Client/Master/Worker)都稱之一個(gè)Rpc端點(diǎn) ,且都實(shí)現(xiàn)RpcEndpoint接口,內(nèi)部根據(jù)不同端點(diǎn)的需求設(shè)計(jì)不同的消息和不同的業(yè)務(wù)處理,如果需要發(fā)送/詢問(wèn)則調(diào)用Dispatcher
RpcEnv:RPC上下文環(huán)境,每個(gè)Rpc端點(diǎn)運(yùn)行時(shí)依賴的上下文環(huán)境稱之為RpcEnv
Dispatcher:消息分發(fā)器,針對(duì)于RPC端點(diǎn)需要發(fā)送或者遠(yuǎn)程RPC介紹到的消息分發(fā)至對(duì)應(yīng)的指令收件箱/發(fā)件箱,如果指令接收方是自己存入收件箱,如果指令接收方為非自身端點(diǎn),則放入發(fā)件箱
Inbox:指令消息收件箱,一個(gè)本地端點(diǎn)對(duì)應(yīng)一個(gè)收件箱,Dispatcher在每次向Inbox存入消息時(shí)都會(huì)將對(duì)應(yīng)EndpointData加入內(nèi)部待Receiver Queue中,另外Dispatcher創(chuàng)建時(shí)會(huì)啟動(dòng)一個(gè)單獨(dú)線程進(jìn)行輪詢Receiver Queue,進(jìn)行收件箱消息消費(fèi)
OutBox:指令消息發(fā)件箱,一個(gè)遠(yuǎn)程端點(diǎn)對(duì)應(yīng)一個(gè)發(fā)件箱,當(dāng)消息放入Outbox后,緊接著將消息通過(guò)TransportClient發(fā)送出去,在同一個(gè)線程中進(jìn)行,原因?yàn)檫h(yuǎn)程消息分為RpcOutboxMessage, OneWayOutboxMessage兩種消息,而針對(duì)于需要應(yīng)答的消息直接發(fā)送更加合適
TransportClient:Netty通信客戶端,根據(jù)outbox的消息的receiver請(qǐng)求對(duì)應(yīng)遠(yuǎn)程TransportServer,
TransportServer:Netty通信服務(wù)端,一個(gè)RPC端點(diǎn)一個(gè)TransportServer,接受遠(yuǎn)程消息后調(diào)用Dispatcher分發(fā)消息至對(duì)應(yīng)收發(fā)件箱
特別說(shuō)明
TransportClient與TransportServer通信虛線表示兩個(gè)RpcEnv之間的通信,圖示沒(méi)有單獨(dú)表達(dá)式
一個(gè)Outbox一個(gè)TransportClient,圖示沒(méi)有單獨(dú)表達(dá)式
一個(gè)RpcEnv中存在兩個(gè)RpcEndpoint,一個(gè)代表本身啟動(dòng)的RPC端點(diǎn),另外一個(gè)為 RpcEndpointVerifier
二、Endpoint啟動(dòng)過(guò)程
啟動(dòng)的流程如下:
Endpoint啟動(dòng)過(guò)程基本上與組件概覽中組件能很好的對(duì)應(yīng)
Endpoint啟動(dòng)后,默認(rèn)會(huì)向Inbox中添加OnStart消息,不同的端點(diǎn)(Master/Worker/Client)消費(fèi)OnStart指令時(shí),進(jìn)行相關(guān)端點(diǎn)的啟動(dòng)額外處理
Endpoint啟動(dòng)時(shí),會(huì)默認(rèn)啟動(dòng)TransportServer,且啟動(dòng)借宿后會(huì)進(jìn)行一次同步測(cè)試rpc可用性(askSync-BoundPortsRequest)
Dispatcher作為一個(gè)分發(fā)器,內(nèi)部存放了Inbox,Outbox的等相關(guān)句柄和存放了相關(guān)處理狀態(tài)數(shù)據(jù),結(jié)構(gòu)大致如下
<