Spark RPC 之 Executor 向Driver下载 Jar、File 流程

我们先回顾下 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对象的封装,至此,流程结束。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容