Spark通讯框架

Posted 大数据技术AI

tags:

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

01
  Spark内置RPC框架



在Spark中,很多地方都涉及到网络通讯
比如:
  • Spark各组件间的消息通讯
  • 用户文件与Jar包的上传
  • 节点间的Shuffle过程
  • Block数据的复制与备份
  • ...

  1. 在 Spark0.x.x 与 Spark1.x.x 版本中, 组件间的消息通信主要借助于 Akka.

  2. 在Spark1.3中引入了Netty通信框架

  3.  Akka要求message发送端和接收端有相同的版本, 所以为了避免 Akka 造成的版本问题,并给用户的应用更大灵活性,决定使用更通用的 RPC 实现,也就是现在的 Netty 来替代 Akka

  4. Spark1.6 中 Akka 和 Netty 可以配置使用。Netty 完全实现了 Akka 在Spark 中的功能

  5. 从Spark2.0.0, Akka 被移除


02
 Actor模型




03
  Netty通信框架



Spark通讯框架中各个组件(Client/Master/Worker)可以认为是一个个独立的实体,各个实体之间通过消息来进行通信。


  • EndPoint(Client/Master/Worker)有1个InBox和N个OutBox(N>=1,N取决于当前 Endpoint 与多少其他的 Endpoint 进行通信,一个与其通讯的其他Endpoint 对应一个 OutBox

  • EndPoint接收到的消息被写入InBox

  • 发出的消息写入OutBox并被发送到其他Endpoint的InBox中


具体各个组件之间的关系图如下:


Spark通讯框架



04
  Netty通信框架解析



Spark通讯框架


1)RpcEndpoint:RPC 端点



Spark 针对每个节点(Client/Master/Worker)都称之为一个 RpcEndpoint ,且都实现 RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则内部调用 Dispatcher 的对应方法;

说明:

  • RpcEndpoint是用来接收消息的

  • 发送消息使用RpcEndpointRef

  • RpcEndpointRef的具体实现类是: NettyRpcEndpointRef


Spark通讯框架


2)RpcEnv:Rpc上下文(Rpc环境)



每个RpcEndpoint运行时依赖的上下文环境称为 RpcEnv

3)Dispatcher:消息分发器



RPC 端点需要发送消息或者从远程 RPC 端点接收到的消息,分发至对应的指令收件箱/发件箱。

• 如果指令接收方是自己则存入收件箱

• 如果指令接收方不是自己则放入发件箱

// class NettyRpcEnvprivate[netty] def send(message: RequestMessage): Unit = { // 获取接收者地址信息 val remoteAddr = message.receiver.address if (remoteAddr == address) { // Message to a local RPC endpoint. // 把消息发送到本地的 RPC 端点 (发送到收件箱) try { dispatcher.postOneWayMessage(message) } catch { case e: RpcEnvStoppedException => logWarning(e.getMessage) } } else { // Message to a remote RPC endpoint. // 把消息发送到远程的 RPC 端点. (发送到发件箱) postToOutbox(message.receiver, OneWayOutboxMessage(serialize(message))) }}


4)Inbox:指令消息收件箱。



一个本地 RpcEndpoint 对应一个收件箱

5)RpcEndpointRef:RpcEndpointRef 是对远程 RpcEndpoint 的一个引用。



当我们需要向一个具体的 RpcEndpoint 发送消息时,一般我们需要获取到该RpcEndpoint 的引用,然后通过该引用发送消息。

6)OutBox:指令消息发件箱



对于当前 RpcEndpoint 来说,一个目标 RpcEndpoint 对应一个当前的发件箱,如果向多个目标 RpcEndpoint 发送信息,则有当前会有多个 OutBox。当消息放入 Outbox 后,紧接着通过 TransportClient 将消息发送出去。消息放入发件箱以及发送过程是在同一个线程中进行



8)TransportClient:Netty通信客户端



一个 OutBox 对应一个 TransportClient,TransportClient 不断轮询OutBox,根据 OutBox 消息的 receiver 信息,请求对应的远程 TransportServer;


9)TransportServer:Netty 通信服务端



一个 RpcEndpoint 对应一个 TransportServer,接受远程消息后调用 Dispatcher 分发消息至自己的收件箱,或者对应的发件箱;




Spark通讯框架

扫码二维码

获取更多精彩

大数据技术AI



以上是关于Spark通讯框架的主要内容,如果未能解决你的问题,请参考以下文章

Spark通信框架Spark Network Common

在这个 spark 代码片段中 ordering.by 是啥意思?

python+spark程序代码片段

异常和TCP通讯

golang代码片段(摘抄)

spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段