Spark通信-Dispatcher
Spark作为优秀的大数据处理的处理框架,需要通过集群机器的协作来高效的处理数据,为了实现集群的功能,机器之间稳定及高性能的通信就成为了必要条件.为此,spark在2.x的版本就使用netty彻底替换掉了akka,作为spark的通信框架,并设计了如下通讯架构:
1.RpcEndpoint:RPC端点,Spark针对每个节点(Client/Master/Worker)都称之为一个Rpc端点,且都实现RpcEndpoint接口,内部根据不同端点的需求,设计不同的消息和不同的业务处理,如果需要发送(询问)则调用Dispatcher;
2.RpcEnv:RPC上下文环境,每个RPC端点运行时依赖的上下文环境称为RpcEnv;
3.Dispatcher:消息分发器,针对于RPC端点需要发送消息或者从远程RPC接收到的消息,分发至对应的指令收件箱/发件箱。如果指令接收方是自己则存入收件箱,如果指令接收方不是自己,则放入发件箱;
4.Inbox:指令消息收件箱,一个本地RpcEndpoint对应一个收件箱,Dispatcher在每次向Inbox存入消息时,都将对应EndpointData加入内部ReceiverQueue中,另外Dispatcher创建时会启动一个单独线程进行轮询ReceiverQueue,进行收件箱消息消费;
5.RpcEndpointRef:RpcEndpointRef是对远程RpcEndpoint的一个引用。当我们需要向一个具体的RpcEndpoint发送消息时,一般我们需要获取到该RpcEndpoint的引用,然后通过该应用发送消息。
6.OutBox:指令消息发件箱,对于当前RpcEndpoint来说,一个目标RpcEndpoint对应一个发件箱,如果向多个目标RpcEndpoint发送信息,则有多个OutBox。当消息放入Outbox后,紧接着通过TransportClient将消息发送出去。消息放入发件箱以及发送过程是在同一个线程中进行;
7.RpcAddress:表示远程的RpcEndpointRef的地址,Host+Port。
8.TransportClient:Netty通信客户端,一个OutBox对应一个TransportClient,TransportClient不断轮询OutBox,根据OutBox消息的receiver信息,请求对应的远程TransportServer;
9.TransportServer:Netty通信服务端,一个RpcEndpoint对应一个TransportServer,接受远程消息后调用Dispatcher分发消息至对应收发件箱
本文主要讲讲Spark的消息分发器—Dispatcher
Dispatcher初始化:
1. endpoints: ConcurrentMap[String, MessageLoop],负责存储 endpoint name 和MessageLoop的映射关系
2. endpointRefs: ConcurrentMap[RpcEndpoint, RpcEndpointRef] 包含了 RpcEndpoint 和 RpcEndpointRef 的映射关系
3. stopped : 标志 Dispatcher 是否已经停止
4. sharedLoop:负责处理接受到的信息
Dispatcher注册rpc:
在RPC 服务端启动时调用registerRpcEndpoint,将endpoint注册到endpoints
Dispatcher消息处理:
Dispacther的所有消息,最终都会由postMessage方法去处理,其中主要是通过loop.post()方法去调用SharedMessageLoop的Post方法,再由其中的inbox处理数据,此处不展开讲inbox.
总结:Dispatcher的作用主要是维护endpoint信息,并实现服务端的消息分发工作,而具体的消息处理,则有inbox进行处理。
- 点赞
- 收藏
- 关注作者
评论(0)