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

我们先回顾下 Spark 的 client 和 server 通过RPC通信流程,先看下流程图:
client 通过 NettyRpcEndpointRef 调用 ask 通过 NettyRpcEnv 把消息传给 OutBox 的 Messages:


Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第1张图片

OutBox 调用 send ,通过 TransportClient 然后 TransportResponseHandler 把消息发给 server:


Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第2张图片

在 TransportClient.sendRpc 方法中,生成了 RequestID 和 message 进行绑定,client 通过 requestId 来追踪请求。

server 通过 TransportChannelHandler 的 channelRead 收到消息,并调用 TransportRequestHandler 的 handle 方法,在这里对 requestMessage 的类型进行了区分,以分别处理。然后调用 NettyRpcEnv 的receive 方法,把消息传递给 Dispatcher,通过 Dispatcher、Inbox Messages 和 Message Loop 完成对请求消息的分发及处理,如图所示:


Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第3张图片

然后 Dispatcher 把消息分发到 EndPoint,调用 RemoteNettyRpcCallContext RpcResponseCallBack TransportRequestHandler,把消息发给Client:


Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第4张图片

client 还是通过 TransportChannelHandler 的 channelRead 接收消息,然后调用 TransportResponse 然后回调到 RpcResponseCallBack 的 onSuccess 方法:


Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第5张图片

上面的流程详细的可参考:https://blog.csdn.net/u011564172/article/details/62043236

下载 jar file

RpcEnvFileServer 作用于 driver 程序,为executor提供jar和file的远程下载服务,内部实现有两个,NettyStreamManager、HttpBasedFileServer,底层实现分别为netty和jetty,同时介绍了RpcEnvFileServer提供下载服务的流程:
NettyStreamManager:


Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第6张图片

上面这个流程 和 server 接收 client 消息一样的,只不过是 在 TransportRequestHandler 的 handle 方法中 对 requestMessage 做了区分,如果是 Stream 类型消息,则调用 processStreamRequest 方法:


Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第7张图片

Spark RPC 之 Executor 向Driver下载 Jar、File 流程_第8张图片

handle方法中处理Stream请求的processStreamRequest方法,如上图,StreamManager调用openStream方法,返回file对象的封装,至此,流程结束。

你可能感兴趣的:(Spark RPC 之 Executor 向Driver下载 Jar、File 流程)