Spark Rpc框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuxintdrh/article/details/89293505

参考:
https://www.cnblogs.com/jiaan-geng/p/9798078.html
https://www.jianshu.com/p/7b32d8c5a1b3
https://www.cnblogs.com/superhedantou/p/7570692.html

一、RPC框架的基本架构

  在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通、用户文件与Jar包的上传、节点间的Shuffle过程、Block数据的复制与备份等。在Spark 0.x.x与Spark 1.x.x版本中,组件间的消息通信主要借助于Akka,使用Akka可以轻松的构建强有力的高并发与分布式应用。
但是Akka在Spark 2.0.0版本中被移除了

  • Spark官网文档对此的描述为:“Akka的依赖被移除了,因此用户可以使用任何版本的Akka来编程了。”Spark团队的决策者或许认为对于Akka具体版本的依赖,限制了用户对于Akka不同版本的使用。
  • 一些Java Application或者Java Web就利用Akka的丰富特性实现了分布式一致性、最终一致性以及分布式事务等分布式环境面对的问题。

在Spark 1.x.x版本中,用户文件与Jar包的上传采用了由Jetty实现的HttpFileServer

  • 在Spark 2.0.0版本中也被废弃了,
  • 现在使用的是基于Spark内置RPC框架的NettyStreamManager。

节点间的Shuffle过程和Block数据的复制与备份这两个部分在Spark 2.0.0版本中依然沿用了Netty,通过对接口和程序进行重新设计将各个组件间的消息互通、用户文件与Jar包的上传等内容统一纳入到Spark的RPC框架体系中
在这里插入图片描述

二、通过类图更加详细了解各组件的关系

spark 基于netty新的rpc框架借鉴了Akka的中的设计,它是基于Actor模型,各个组件可以认为是一个个独立的实体,各个实体之间通过消息来进行通信。具体各个组件之间的关系图如下
在这里插入图片描述

2.1 RpcEndpoint

表示一个个需要通信的个体(如master,worker,driver),主要根据接收的消息来进行对应的处理。一个RpcEndpoint经历的过程依次是:构建->onStart→receive→onStop。其中onStart在接收任务消息前调用,receive和receiveAndReply分别用来接收另一个RpcEndpoint(也可以是本身)send和ask过来的消息。

2.2 RpcEndpointRef

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

2.3 RpcAddress

表示远程的RpcEndpointRef的地址,Host + Port。

2.4 RpcEnv

RpcEnv为RpcEndpoint提供处理消息的环境。RpcEnv负责RpcEndpoint整个生命周期的管理,包括:注册endpoint,endpoint之间消息的路由,以及停止endpoint。
在这里插入图片描述

三、一些概念

3.1、RpcHandler

猜你喜欢

转载自blog.csdn.net/wuxintdrh/article/details/89293505