概要
spark运行时executor可能需要远程下载driver上的jar或文件到本地,对应的内部实现为:
- 父类:
RpcEnvFileServer
- 子类:
NettyStreamManager
、HttpBasedFileServer
,底层分别由netty、jetty实现
根据参数spark.rpc.useNettyFileServer
配置,如下:
(没找到是在哪儿判断的,是放弃了http,只用Netty吗?)
1. 父类:RpcEnvFileServer
如上,RpcEnvFileServer定义两个抽象方法,addFile
和addJar
,用于将jar和file添加到文件服务器,提供下载服务,其实现类有HttpBasedFileServer、NettyStreamManager。
1.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包了,具体参考下一篇博客。
1.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的。