目录
RPC客户端工厂TransprotClientFactory
作为一个分布式计算引擎,既然是分布式,那么网络通信是肯定少不了的,在Spark中很多地方都涉及到了网络通信,各个组件之间消息传输、用户文件和资源的上传、Shuffle过程、Block的数据复制与备份等等,都少不了网络通信。
在Spark2.X之前,Spark组件通信使用Akka,用户文件和资源的上传是基于Jetty实现的HttpFileServer,Shuffle过程、Block的数据复制与备份是基于Netty实现的。Spark2.0版本之后,Spark放弃了Akka和Jetty,各个组件之间消息传输、用户文件和资源的上传、Shuffle过程、Block的数据复制与备份等等统一采用Spark的RPC框架NettyStreamManager,将通信框架统一起来了。
RPC上下文TransportContext
org.apache.spark.network.TransportContext,传输上下文,其主要作用是创建TransportServer,TransportClientFactory和使用TransportChannelHandler设置Netty Channel pipelines(Netty的通信管道)。
TransportClient 提供了两个通信协议,分别是RPC控制层和数据层。RPC的处理是在TransportContext之外的,它负责设置流,这个流以zero-copy IO的形式与数据块进行通信传输。
TransportServer和TransportClientFactory都为每一个channel创建一个TransportChannelHandler。每一个TransportChannelHandler都包含一个TransportClient,可以使得服务进程通过现有的channel发送消息给客户端。
下面是TransportContext的源码分析:
TransportContext中包含TransportConf、RpcHandler、MessageEncoder、MessageDecoder和一个创建TransportChannelHandler时使用的closeIdleConnections(布尔型)属性;两个构造方法,TransportConf、RpcHandler是必须传入TransportContext中的,closeIdleConnections选填。如下图所示:
TransportContext的主要作用之一就是创建TransprotClientFactory,创建TransportClientFactory时需要传入TransportClientBootstrap列表。
TransportContext另一个主要作用就是创建TransportServer,RPC框架的服务端,创建服务端时可以设置指定的端口,也可以指定特定的IP地址+端口,当然也可以既不指定IP地址也不指定端口(此时,端口默认为0)。创建TransportServer时还需要传入一个TransportServerBootstrap列表。
TransportContext的最后一个作用就是创建TransportChannelHandler,并使用TransportChannelHandler设置Netty Channel pipelines(Netty的通信管道)。初始化Netty通信管道,设置编码/解码,TransportChannelHandler还进行发送/接收消息处理。TransportChannelHandler包含TransportClient,在此channel上进行通信,与此channel直接关联,确保所有用户使用channel时得到的是同一个TrasportClient对象。
RPC配置TransportConf
TransportContext中包含org.apache.spark.network.util.TransportConf,TransportConf提供整个RPC框架的配置信息。TransprotConf有两个主要的成员属性,分别是配置提供者conf和模块配置名称module,还有一些关键配置信息的KEY,根据这些KEY,TransportConf为RPC框架提供相应的API可获取配置信息。
模块配置名称module与getConfKey(String suffix)方法结合,为关键配置信息的KEY赋值,赋值的格式是:
"spark." + module + "." + suffix,suffix是具体的后缀
具体实现是: