我们先回顾下 Spark 的 client 和 server 通过RPC通信流程,先看下流程图:
client 通过 NettyRpcEndpointRef 调用 ask 通过 NettyRpcEnv 把消息传给 OutBox 的 Messages:
OutBox 调用 send ,通过 TransportClient 然后 TransportResponseHandler 把消息发给 server:
在 TransportClient.sendRpc 方法中,生成了 RequestID 和 message 进行绑定,client 通过 requestId 来追踪请求。
server 通过 TransportChannelHandler 的 channelRead 收到消息,并调用 TransportRequestHandler 的 handle 方法,在这里对 requestMessage 的类型进行了区分,以分别处理。然后调用 NettyRpcEnv 的receive 方法,把消息传递给 Dispatcher,通过 Dispatcher、Inbox Messages 和 Message Loop 完成对请求消息的分发及处理,如图所示:
然后 Dispatcher 把消息分发到 EndPoint,调用 RemoteNettyRpcCallContext RpcResponseCallBack TransportRequestHandler,把消息发给Client:
client 还是通过 TransportChannelHandler 的 channelRead 接收消息,然后调用 TransportResponse 然后回调到 RpcResponseCallBack 的 onSuccess 方法:
上面的流程详细的可参考:https://blog.csdn.net/u011564172/article/details/62043236
下载 jar file
RpcEnvFileServer 作用于 driver 程序,为executor提供jar和file的远程下载服务,内部实现有两个,NettyStreamManager、HttpBasedFileServer,底层实现分别为netty和jetty,同时介绍了RpcEnvFileServer提供下载服务的流程:
NettyStreamManager:
上面这个流程 和 server 接收 client 消息一样的,只不过是 在 TransportRequestHandler 的 handle 方法中 对 requestMessage 做了区分,如果是 Stream 类型消息,则调用 processStreamRequest 方法:
handle方法中处理Stream请求的processStreamRequest方法,如上图,StreamManager调用openStream方法,返回file对象的封装,至此,流程结束。
网友评论