我們先回顧下 Spark 的 client 和 server 通過RPC通信流程,先看下流程圖:
client 通過 NettyRpcEndpointRef 調(diào)用 ask 通過 NettyRpcEnv 把消息傳給 OutBox 的 Messages:
OutBox 調(diào)用 send 滔驶,通過 TransportClient 然后 TransportResponseHandler 把消息發(fā)給 server:
在 TransportClient.sendRpc 方法中揭糕,生成了 RequestID 和 message 進行綁定,client 通過 requestId 來追蹤請求著角。
server 通過 TransportChannelHandler 的 channelRead 收到消息吏口,并調(diào)用 TransportRequestHandler 的 handle 方法,在這里對 requestMessage 的類型進行了區(qū)分产徊,以分別處理。然后調(diào)用 NettyRpcEnv 的receive 方法戈盈,把消息傳遞給 Dispatcher深滚,通過 Dispatcher、Inbox Messages 和 Message Loop 完成對請求消息的分發(fā)及處理血柳,如圖所示:
然后 Dispatcher 把消息分發(fā)到 EndPoint生兆,調(diào)用 RemoteNettyRpcCallContext RpcResponseCallBack TransportRequestHandler,把消息發(fā)給Client:
client 還是通過 TransportChannelHandler 的 channelRead 接收消息根吁,然后調(diào)用 TransportResponse 然后回調(diào)到 RpcResponseCallBack 的 onSuccess 方法:
上面的流程詳細的可參考:https://blog.csdn.net/u011564172/article/details/62043236
下載 jar file
RpcEnvFileServer 作用于 driver 程序击敌,為executor提供jar和file的遠程下載服務(wù)拴事,內(nèi)部實現(xiàn)有兩個,NettyStreamManager刃宵、HttpBasedFileServer牲证,底層實現(xiàn)分別為netty和jetty,同時介紹了RpcEnvFileServer提供下載服務(wù)的流程:
NettyStreamManager:
上面這個流程 和 server 接收 client 消息一樣的十厢,只不過是 在 TransportRequestHandler 的 handle 方法中 對 requestMessage 做了區(qū)分,如果是 Stream 類型消息寿烟,則調(diào)用 processStreamRequest 方法:
handle方法中處理Stream請求的processStreamRequest方法筛武,如上圖,StreamManager調(diào)用openStream方法内边,返回file對象的封裝待锈,至此,流程結(jié)束竿音。