概要
spark运行时executor可能需要远程下载driver上的jar或文件到本地,对应的内部实现为RpcEnvFileServer,RpcEnvFileServer的子类有NettyStreamManager、HttpBasedFileServer,底层分别由netty、jetty实现,根据参数spark.rpc.useNettyFileServer配置,如下。
RpcEnvFileServer
如上,RpcEnvFileServer定义两个抽象方法,addFile和addJar,用于将jar和file添加到文件服务器,提供下载服务,其实现类有HttpBasedFileServer、NettyStreamManager。
1.HttpBasedFileServer
HttpBasedFileServer底层由jetty实现。
如上图,HttpBasedFileServer继承RpcEnvFileServer,同时拥有属性HttpFileServer,HttpFileServer拥有属性HttpServer,HttpServer中start方法调用doStart方法,doStart方法中启动jetty server,提供文件下载服务,doStart方法中启动jetty server代码如下(对源码稍作整理)
下面查看启动基于jetty server的文件服务器的流程
分为以下两部分
- driver程序启动,初始化SparkContext时启动jetty server,流程如上图①至⑨,其中jetty server文件服务器的根目录为HttpFileServer的baseDir目录(默认为/tmp/UUID),下面有两个二级目录jars、files分别存放jar和file。
- 调用SparkContext的addJar方法依次将driver程序和spark-submit中指定的jar包copy到jetty文件服务器的baseDir/jars目录下,如上图②⑩⑪⑫流程。
至此,executor执行task时,就可以根据driverURL和收到的jar包名连接jetty,远程下载jar包了,具体参考下一篇博客。
2.NettyStreamManager
NettyStreamManager借助于RpcEnv中启动的netty提供服务,请参考Spark RPC之Netty启动。
如上图,NettyStreamManager和HttpBasedFileServer不同,其没有将文件写入本地,而是使用两个属性jars和files集合保存,对应的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的远程下载服务,内部实现有两个,NettyStreamManager、HttpBasedFileServer,底层实现分别为netty和jetty,同时介绍了RpcEnvFileServer提供下载服务的流程,下一篇,我们查看executor如何远程下载jar的。