博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spark rpc简述
阅读量:4594 次
发布时间:2019-06-09

本文共 1890 字,大约阅读时间需要 6 分钟。

Spark2 rpc

一、前言

Spark在1.6之前的通信使用的是akka框架,在1.6可选用akka还是netty,2.0之后摒弃akka。Akka也是一个优秀的框架,为什么摒弃它官方给出的原因如下:

1、很多Spark用户自己也是使用Akka,但是由于Akka版本之间无法互相通信,这就要求用户必须使用跟Spark完全相同的版本,导致用户无法升级Akka。

2、Spark用的Akka配置是针对Spark自身来调优的,可能跟用户自己代码中的Akka配置冲突。

3、Spark用的Akka特性很少,这部分特性很容易自己实现,同时这部分代码量相比Akka来说少很多,debug比较容易。如果遇到什么bug,也可以自己马上fix,不需要等到Akka上游发布新版本。而且Spark审计Akka本身因为第一点会强制要求用户升级他们的Akka版本,对某些用户来说这代价是比较昂贵的或者是不太现实的。

二、通信组件概览

 

 

 

RpcEnv:RPC环境,每个Rpc端点运行时依赖的环境

RPCEndpoint:RPC端点,Spark将每个通信实体都称之为一个Rpc端点,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的信息和不同的业务处理。

RpcEndpointRef:一个对RpcEndpoint的远程应用对象,通过它可以想远程端点发送信息一进行通信。

如果想要与一个RpcEndpoint端进行通信,一定需要获取到该RpcEndpoint一个RpcEndpointRef,通过RpcEndpointRef与RpcEndpoint进行通信,只能通过一个RpcEnv环境对象来获取RpcEndpoint对应的RpcEndpointRef。

客户端通过RpcEndpointRef发消息,首先通过RpcEnv来处理这个消息,找到这个消息具体发给谁,然后路由给RpcEndpoint实体。

Dispatcher:消息分发器,负责将RpcMessage分发至对应的RpcEndpoint。其包含一个Meseageloop,它读取LinkedBlockingQueue中投递的的RpcMessage,根据客户端指定的Endpoint表示,找到Endpoint的Inbox,然后投递进去,由于是阻塞队列,当没有消息的时候自然阻塞,一旦有消息,就开始工作。Dispatcher的ThreadPool负责消费这些message。

Inbox:一个本地端点对应一个收件箱,Inbox里面有一个InboxMessage的链表,InboxMessage有很多子类,可以是远程调用过来的RpcMessage,可以是远程调用过来的fire-and-forget的单向消息OneWayMessage,还可以是各种服务启动、链路建立断开等Message,这些message都会在Inbox内部的方法内做模式匹配,调用相应的RpcEndpoint的函数。

Outbox:一个远程端点对应一个收件箱,NettyRpcEnv中包含一个ConcurrentHashMap[RpcAddress,Outbox]。当消息放入Outbox后,紧接着将消息通过TransportClient发送出去

TranSportClient:Netty通信客户端,一个Outbox对应一个TranSportClient,根据Outbox消息的receiver消息,请求对应远程TranSportClient。

TranSportServer:Netty通信服务端,一个Rpc端点对应一个TranSportServer,接远程消息后调用Dispatcher分发消息至对应的收发件箱。

三、通信

 

 

 

 

EndPoint启动后,默认会向Inbox中添加Onstart消息,不同的端点消费Onstart指令时,进行相关端点的启动处理流程。

Endpoint启动时,会默认启动TranSportServer,且启动结束后会进行一次同步测试可用性。

Dispatcher作为一个分发器,内部存放了Inbox句柄和状态数据(outboxes在NettyRpcEnv中)

在构建Dispatcher时会创建一个线程池,该线程池循环从receivers阻塞队列中取出EndpointData处理,如果receivers中没有EndpointData,就阻塞。有EndpointData就从该EndpointData的Inbox中取出消息消费。

 

 

转载于:https://www.cnblogs.com/lsbigdata/p/11475352.html

你可能感兴趣的文章
[Android][Android Studio] Gradle项目中加入JNI生成文件(.so文件)
查看>>
JMeter基础知识
查看>>
组合数据类型练习,英文词频统计实例上
查看>>
python入门知识
查看>>
为什么我在博客园开始写博客
查看>>
ES6数组的扩展
查看>>
xshell不能输入中文,显示为??
查看>>
[NGUI]NGUI图集Atlas制作
查看>>
vue的坑
查看>>
【原创】大数据基础之Airflow(2)生产环境部署airflow研究
查看>>
传说中的滑雪,巨丑勿拍(poj1088/tyvj1004)
查看>>
webpack——图片的路径与打包
查看>>
.net4.0注册到IIS ,重新注册IIS ,iis注册
查看>>
常见Jquery问题
查看>>
jsp统计页面访问量和刷访问量的简单使用
查看>>
调试的新花招,利用firebug动态加载js库文件
查看>>
Unity3d的序列帧动画
查看>>
获取ScrollView的onScrollListener
查看>>
约数的个数
查看>>
Visual Studio 2008 具有一些新的报表功能和改进之处
查看>>