【Spark内核源码】内置的RPC框架,Spark的通信兵(一)

目录

RPC上下文TransportContext

RPC配置TransportConf

RPC客户端工厂TransprotClientFactory

RPC服务端TransportServer


作为一个分布式计算引擎,既然是分布式,那么网络通信是肯定少不了的,在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的成员属性和构造方法

TransportContext的主要作用之一就是创建TransprotClientFactory,创建TransportClientFactory时需要传入TransportClientBootstrap列表。

创建TransprotClientFactory

TransportContext另一个主要作用就是创建TransportServer,RPC框架的服务端,创建服务端时可以设置指定的端口,也可以指定特定的IP地址+端口,当然也可以既不指定IP地址也不指定端口(此时,端口默认为0)。创建TransportServer时还需要传入一个TransportServerBootstrap列表。

创建TransportServer

TransportContext的最后一个作用就是创建TransportChannelHandler,并使用TransportChannelHandler设置Netty Channel pipelines(Netty的通信管道)。初始化Netty通信管道,设置编码/解码,TransportChannelHandler还进行发送/接收消息处理。TransportChannelHandler包含TransportClient,在此channel上进行通信,与此channel直接关联,确保所有用户使用channel时得到的是同一个TrasportClient对象。

创建TransportChannelHandler

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是具体的后缀

 具体实现是:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值