Spark RPC之RpcEnvFileServer

来源:互联网 发布:淘宝网 女士腕表 编辑:程序博客网 时间:2024/06/05 00:14

概要

spark运行时executor可能需要远程下载driver上的jar或文件到本地,对应的内部实现为RpcEnvFileServer,RpcEnvFileServer的子类有NettyStreamManager、HttpBasedFileServer,底层分别由netty、jetty实现,根据参数spark.rpc.useNettyFileServer配置,如下。

RpcEnvFileServer


如上,RpcEnvFileServer定义两个抽象方法,addFileaddJar,用于将jar和file添加到文件服务器,提供下载服务,其实现类有HttpBasedFileServerNettyStreamManager

1.HttpBasedFileServer

HttpBasedFileServer底层由jetty实现。

如上图,HttpBasedFileServer继承RpcEnvFileServer,同时拥有属性HttpFileServer,HttpFileServer拥有属性HttpServer,HttpServer中start方法调用doStart方法,doStart方法中启动jetty server,提供文件下载服务,doStart方法中启动jetty server代码如下(对源码稍作整理)

下面查看启动基于jetty server的文件服务器的流程

分为以下两部分

  1. driver程序启动,初始化SparkContext时启动jetty server,流程如上图①至⑨,其中jetty server文件服务器的根目录为HttpFileServer的baseDir目录(默认为/tmp/UUID),下面有两个二级目录jarsfiles分别存放jar和file。
  2. 调用SparkContext的addJar方法依次将driver程序和spark-submit中指定的jar包copy到jetty文件服务器的baseDir/jars目录下,如上图②⑩⑪⑫流程。

至此,executor执行task时,就可以根据driverURL和收到的jar包名连接jetty,远程下载jar包了,具体参考下一篇博客。

2.NettyStreamManager

NettyStreamManager借助于RpcEnv中启动的netty提供服务,请参考Spark RPC之Netty启动。

如上图,NettyStreamManagerHttpBasedFileServer不同,其没有将文件写入本地,而是使用两个属性jarsfiles集合保存,对应的addJar方法就是将File对象添加到集合jars中,下载文件依靠openStream方法,结果封装为ManagedBuffer返回(ManagedBuffer的概念在Spark RPC之RpcRequest请求处理流程有介绍),openStream方法继承自StreamManager,StreamManager提供底层文件的下载服务,如shuffle过程中间结果的下载,后续详细介绍,UML如下

NettyStreamManager处理请求和RPC相似,如下

流程简单,不详细介绍,完整流程参考Spark RPC之RpcResponse处理 (除请求类型不同外,流程一致),再贴出上述流程中的两处源码

TransportRequestHandler的handle方法,根据请求消息类型,分别处理。

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

总结

RpcEnvFileServer作用于driver程序,为executor提供jar和file的远程下载服务,内部实现有两个,NettyStreamManagerHttpBasedFileServer,底层实现分别为netty和jetty,同时介绍了RpcEnvFileServer提供下载服务的流程,下一篇,我们查看executor如何远程下载jar的。

2 0
原创粉丝点击