设为首页 加入收藏

TOP

Spark Rpc框架
2019-04-15 13:27:28 】 浏览:24
Tags: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。
在这里插入图片描述

三、一些概念

TransportContext:传输上下文,包含了用于创建传输服务端(TransportServer)和传输客户端工厂(TransportClientFactory)的上下文信息,并支持使用TransportChannelHandler设置Netty提供的SocketChannel的Pipeline的实现。

  • TransportConf:传输上下文的配置信息。
  • RpcHandler:对调用传输客户端(TransportClient)的sendRPC方法发送的消息进行处理的程序。
  • MessageEncoder:在将消息放入管道前,先对消息内容进行编码,防止管道另一端读取时丢包和解析错误。
  • MessageDecoder:对从管道中读取的ByteBuf进行解析,防止丢包和解析错误;
  • TransportServer:RPC框架的服务端,提供高效的、低级别的流服务。由TransportContext的createServer创建
  • TransportClientFactory:创建传输客户端(TransportClient)的传输客户端工厂类。
    • ClientPool:在两个对等节点间维护的关于传输客户端(TransportClient)的池子。ClientPool是TransportClientFactory的内部组件。
    • TransportClient:RPC框架的客户端,用于获取预先协商好的流中的连续块。TransportClient旨在允许有效传输大量数据,这些数据将被拆分成几百KB到几MB的块。当TransportClient处理从流中获取的获取的块时,实际的设置是在传输层之外完成的。sendRPC方法能够在客户端和服务端的同一水平线的通信进行这些设置。

RpcResponseCallback:RpcHandler对请求的消息处理完毕后,进行回调的接口。
TransportFrameDecoder:对从管道中读取的ByteBuf按照数据帧进行解析;
TransportClientBootstrap:当服务端响应客户端连接时在客户端执行一次的引导程序。
TransportRequestHandler:用于处理客户端的请求并在写完块数据后返回的处理程序。
TransportResponseHandler:用于处理服务端的响应,并且对发出请求的客户端进行响应的处理程序。
TransportChannelHandler:代理由TransportRequestHandler处理的请求和由TransportResponseHandler处理的响应,并加入传输层的处理。
TransportServerBootstrap:当客户端连接到服务端时在服务端执行一次的引导程序。


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇概览Spark Streaming 实时计算 下一篇spark IDE:   System memory..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }