【Spark2.0源碼學習】-3.Endpoint模型介紹

     Spark做爲分佈式計算框架,多個節點的設計與相互通訊模式是其重要的組成部分。
 
1、組件概覽
     對源碼分析,對於設計思路理解以下:
          

  • RpcEndpoint:RPC端點 ,Spark針對於每一個節點(Client/Master/Worker)都稱之一個Rpc端點 ,且都實現RpcEndpoint接口,內部根據不一樣端點的需求,設計不一樣的消息和不一樣的業務處理,若是須要發送(詢問)則調用Dispatcher
  • RpcEnv:RPC上下文環境,每一個Rpc端點運行時依賴的上下文環境稱之爲RpcEnv
  • Dispatcher:消息分發器,針對於RPC端點須要發送消息或者從遠程RPC接收到的消息,分發至對應的指令收件箱/發件箱。若是指令接收方是本身存入收件箱,若是指令接收方爲非自身端點,則放入發件箱
  • Inbox:指令消息收件箱,一個本地端點對應一個收件箱,Dispatcher在每次向Inbox存入消息時,都將對應EndpointData加入內部待Receiver Queue中,另外Dispatcher建立時會啓動一個單獨線程進行輪詢Receiver Queue,進行收件箱消息消費
  • OutBox:指令消息發件箱,一個遠程端點對應一個發件箱,當消息放入Outbox後,緊接着將消息經過TransportClient發送出去。消息放入發件箱以及發送過程是在同一個線程中進行,這樣作的主要緣由是遠程消息分爲RpcOutboxMessage, OneWayOutboxMessage兩種消息,而針對於須要應答的消息直接發送且須要獲得結果進行處理
  • TransportClient:Netty通訊客戶端,根據OutBox消息的receiver信息,請求對應遠程TransportServer
  • TransportServer:Netty通訊服務端,一個RPC端點一個TransportServer,接受遠程消息後調用Dispatcher分發消息至對應收發件箱
  • 特別說明
    • TransportClient與TransportServer通訊虛線表示兩個RpcEnv之間的通訊,圖示沒有單獨表達式
    • 一個Outbox一個TransportClient,圖示沒有單獨表達式
    • 一個RpcEnv中存在兩個RpcEndpoint,一個表明自己啓動的RPC端點,另一個爲 RpcEndpointVerifier
 
2、Endpoint啓動過程
     啓動的流程以下:
  
  • Endpoint啓動過程基本上與組件概覽中組件能很好的對應
  • Endpoint啓動後,默認會向Inbox中添加OnStart消息,不一樣的端點(Master/Worker/Client)消費OnStart指令時,進行相關端點的啓動額外處理
  • Endpoint啓動時,會默認啓動TransportServer,且啓動結束後會進行一次同步測試rpc可用性(askSync-BoundPortsRequest)
  • Dispatcher做爲一個分發器,內部存放了Inbox,Outbox的等相關句柄和存放了相關處理狀態數據,結構大體以下

     

3、Endpoint Send&Ask流程
     Endpoint的消息發送與請求流程,以下:
  
  • Endpoint根據業務須要存入兩個維度的消息組合:send/ask某個消息,receiver是自身與非自身
    • OneWayMessage: send + 自身, 直接存入收件箱
    • OneWayOutboxMessage:send + 非自身,存入發件箱並直接發送
    • RpcMessage: ask + 自身, 直接存入收件箱,另外還須要存入LocalNettyRpcCallContext,須要回調後再返回
    • RpcOutboxMessage: ask + 非自身,存入發件箱並直接發送,,須要回調後再返回
 
4、Endpoint receive流程
Endpoint的消息的接收,流程以下:
  
  • 上圖 ServerBootstrap爲Netty啓動服務,SocketChanel爲Netty數據通道
  • 上述包含TransportSever啓動與消息接受兩個流程 
 
5、Endpoint Inbox處理流程
     Spark在Endpoint的設計上核心設計即爲Inbox與Outbox,其中Inbox核心要點爲
  • 內部的處理流程拆分爲多個消息指令(InboxMessage)存放入Inbox
  • 當Dispatcher啓動最後,會啓動一個名爲【dispatcher-event-loop】的線程掃描Inbox待處理InboxMessage,並調用Endpoint根據InboxMessage類型作相應處理
  • 當Dispatcher啓動最後,默認會向Inbox存入OnStart類型的InboxMessage,Endpoint在根據OnStart指令作相關的額外啓動工做,三端啓動後全部的工做都是對OnStart指令處理衍生出來的,所以能夠說OnStart指令是相互通訊的源頭
          消息指令類型大體以下三類
  • OnStart/OnStop
  • RpcMessage/OneWayMessage
  • RemoteProcessDisconnected/RemoteProcessConnected/RemoteProcessConnectionError
 
六,Endpoint畫像
 
     該圖理解 Endpoint的結構使用,再也不贅述。
相關文章
相關標籤/搜索