8、Spark通信模块
8.1、通信框架AKKA
先介绍一下RPC:
RCP(Remote Produce Call)是远程过程调用,基于C/S模型调用。
过程大致可以理解为本地分布式对象向主机发请求,不用自己编写底层通信本机。通过向服务器发送请求,服务器对象接受参数后,进行处理,再把处理后的结构发送回客户端。
RPC不支持对象通信,支持对象传输。
Spark在模块通信使用的是AKKA框架。
AKKA基于Scala开发,用于编写Actor应用。Actor模型在并行编程中是比较常用的一种模型。
Actors是一些包含状态和行为的对象。它们通过显示传递消息来进行通信,这些消息会被发送到它们的收件箱中(消息队列)。
一个Actor收到其他Actor消息后,可以根据需要作出各种相应。Actor建立一个消息队列,每次收到消息后,放入队列,而它每次也从队列中取出消息体来处理。通常这个过程是循环的,Actor可以时刻接收处理发送来的消息。
下图为Actor模型:
AKKA Actor树形结构Actors以树结构组织起来。一个Actor可能会把自己的任务划分成更多更小、利于管理的子任务。会开启自己的子Actor,负责监督这些子Actor。
AKKA具有强大的并发处理能力,在国内豌豆荚做了很深的研究和实现。
Spark中并没有充分挖掘AKKA强大的并行计算能力,而是将其作为分布式系统中的RPC框架。很多组件封装为Actor,进行控制和状态通信。
AKKA的优势:
1)、并行和分布式:异步通信和分布式架构;
2)、可靠性:本地和远程都有监控和恢复;
3)、高性能:单机每秒可发送50 000 000个消息。1GB内存中可以创建和保持2 500 000个Actor对象;
4)、去中心:区别于Master/Slave模式,采用无中心节点的架构;
5)、可扩展性:可以在分布式环境下Scale out,线性扩充计算能力;
8.2、Client、Master和Worker间的通信
下图为Spark通信模型:
在Standalone模式下,存在以下角色:
Client:提交作业;
Master:接收作业,启动Driver和Executor,管理Worker;
Worker:管理节点资源,启动Driver和Executor。
Client to Master:
RegisterApplication:注册应用;
Master to Client:
RegisteredApplication:注册应用后回复给Client
ExecutorAdded:通知Client Worker已经启动了Executor,当向Worker发送LaunchExecutor时,通知Client Actor。
ExecutorUpdated:通知Client Executor状态已更新。
Master to Worker:
LaunchExecutor:启动Executor。
RegisteredWorker:Worker注册的回复。
RegiseredWorkerFailed:注册Worker失败的回复。
KillExecutor:停止Executor线程。
Worker to Master:
RegisterWorker:注册Worker。
Hearbeat:周期性的向Master发送心跳信息。
ExecutorStateChanges:通知Master、Wxecutor状态更新。
Actor之间,消息发送端通过”!”符号发送消息,接收端通过receive方法中的case模型匹配接收和处理消息。