首页 > 学院 > 开发设计 > 正文

Spark RPC之Netty启动

2019-11-06 08:38:25
字体:
来源:转载
供稿:网友

概要

Spark RPC概述中我们介绍了Spark RPC接口的设计和使用,spark1.6版本中RPC底层实现使用netty,并在后续2.x版本中彻底移除了akka,因此,我们看下Spark RPC内部如何使用netty的。

RpcEnv(NettyRpcEnv)的创建

查看SparkContext中创建RpcEnv的代码 查看对应的RpcEnv.create方法

根据反射获得RpcEnvFactory实例,默认为NettyRpcEnvFactory,2.x版本中移除了Akka实现。调用NettyRpcEnvFactory的create方法创建RpcEnv,查看对应方法 实例化java序列化工具。实例化NettyRpcEnv。server端启动netty server,提供底层RPC服务。 定义启动netty的方法startNettyRpcEnv,输入为端口号。使用Utils.startServiceOnPort启动server,查看该方法 如上图注释处,startServiceOnPort方法调用startService启动server,而startService就是startNettyRpcEnv方法。

netty server的启动

上一节最后讲到调用startNettyRpcEnv方法启动netty server,而startNettyRpcEnv调用的是NettyRpcEnv.startServer,查看对应方法

调用transportContext的createServer方法启动 netty server,TransportContext用来创建server和clientFactory,下面会讲,查看createServer方法

根据上面截图,createServer执行了如下步骤 1. new TransportServer实例。 2. TransportServer构造器中调用init方法。 3. init方法中启动netty server(不熟悉netty点这里Netty User guide for 4.x)。 到这里,我们跟踪了spark 如何启动netty server。

netty的封装

spark对netty做了封装,在spark-network-common模块,如下 1. TransportContext持有启动netty需要的上下文环境TransportConf,主要作用是创建TransportServerTransportClientFactory。 2. TransportServer通过构造函数启动netty,提供底层通信服务。 3. TransportClientFactory用来创建TransportClient。 4. TransportClient用以和对应的TransportServer通信。 此外还有用于处理信息的MessageEncoderMessageDecoderRpcHandler等,这些和netty的具体使用紧密相关,不作介绍,请参考Netty User guide for 4.x,关于spark-network-common更多信息参考Spark Network Common的实现。

总结

介绍了以下两部分内容: 1. spark中启动netty的过程,即创建RpcEnv时,通过TransportContext实例化TransportServer,TransportServer构造器中启动netty。 2. spark对netty的封装,主要包括TransportContextTransportContextTransportClientFactoryTransportClient


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表