Spark消息通信原理——Spark消息通信架构

Posted sysocjs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark消息通信原理——Spark消息通信架构相关的知识,希望对你有一定的参考价值。

        在Spark中定义了通信框架的接口,这些接口中调用了Netty的具体方法(在spark2.x前,使用的是Akka)。各接口和实现类的关系如下图所示。

技术图片

将终端(EndPoint)注册到Rpc环境中:

        在各个模块中,如DriverEndPoint、ClientEndPoint、Master、Worker等,会先使用RpcEnv的静态方法创建RpcEnv实例,然后实例化终端,由于终端都是继承与ThreadSafeEpcEndPoint,即创建的终端实例属于线程安全的,接着调用RpcEnv的启动终端方法setupEndPoint,将终端和其应用的引用注册到RpcEnv中。换句话说,其他对象只要获取终端引用,就可以与其进行通信。

以master.scala为例,startRpcEnvAndEndPoint方法中,启动消息通信框架的源码:

def startRpcEnvAndEndPoint(host:String, port:Int, webUiPort:Int, conf:SparkConf):(RpcEnv, Int, Option[Int]) = 
    val securityMgr = new SecurityManager(conf)
    val rpcEnv = RpcEnv.create(SYSTEM_NAME, host, port, conf, securityMgr)
    val masterEndPoint = rpcEnv.setupEndPoint(ENDPOINT_NAME, new Master(rpcEnv, rpcEnv.address, webUiPort, securityMgr, conf))    //注册master终端
    val portsResponse = masterEndPoint.askWithRetry[BoundPortsResponse](BoundPortsRequest)(rpcEnv, portsResponse.webUIPort, portsResponse.restPort)

        当然,是先有master终端,才会有worker终端。

以上是关于Spark消息通信原理——Spark消息通信架构的主要内容,如果未能解决你的问题,请参考以下文章

Spark核心原理(核心篇 二)

Spark通讯框架

Spark原理图解:Rpc通信

Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)

Spark RPC

架构设计:系统间通信(19)——MQ:消息协议(上)