4.4.1 通信框架AKKA
Spark在模块间通信使用的是AKKA框架。AKKA基于Scala开发,用于编写Actor应用。Actor模型在并发编程中是比较常见的一种模型。很多开发语言都提供了原生的Actor模型(Erlang、Scala)。Actors是一些包含状态和行为的对象。它们通过显式传递消息来进行通信,这些消息会被发送到它们的收件箱中(消息队列)。从某种意义上来说,Actor是面向对象编程中最严格的实现形式。它们之间可以通过消息来通信。一个Actor收到其他Actor的信息后,可以根据需要做出各种响应。通过Scala的强大模式匹配功能可以让用户自定义多样化的消息。Actor建立一个消息队列,每次收到消息后,放入队列,而它每次也从队列中取出消息体来处理。通常情况下,这个过程是循环的。让Actor可以时刻接收处理发送来的消息。
注意:一个ActorSystem是一个重量级的结构。它会分配N个线程。所以对于每一个应用来说,仅创建一个ActorSystem即可。
图4-14 actor模型
AKKA Actor树形结构Actors以树形结构组织起来。一个Actor可能会把自己的任务划分成更多更小的、利于管理的子任务。为了达到这个目的,它会开启自己的子Actor,并负责监督这些子Actor。关于监督的具体细节就不在这里讨论了。我们只需知道一点,就是每一个Actor都会有一个监督者,即创建这些Actor的Actor。
AKKA的优势和特性如下。
1)并行和分布式:AKKA在设计时采用了异步通信和分布式架构。
2)可靠性:在本地/远程都有监控和恢复机制。
3)高性能:在单机环境中每秒可发送50000000个消息。1GB内存中可创建和保持2500000个Actor对象。
4)去中心:区别于Master-Slave模式,采取无中心节点的架构。
5)可扩展性:可以在分布式环境下进行Scale out,线性扩充计算能力。
可以看到AKKA具有强大的并发处理能力,在国内,豌豆荚对AKKA集群做了很有深度的研究和实践,感兴趣的读者可以进一步了解。
Spark中并没有充分挖掘AKKA强大的并行计算能力,而是将其作为分布式系统中的RPC框架。很多组件封装为Actor,进行控制和状态通信。
Spark中的Client、Master和Worker都是一个Actor。
例如,Master通过worker.actor!LaunchDriver(driver.id,driver.desc)向Worker节点发送启动Driver命令消息,在Worker节点中通过receive的方式响应命令消息。
- override def receive = {
- ……
- case LaunchDriver(driverId, driverDesc) => {
- ……
- }
- ……
综上所述,通过AKKA简洁地实现了Spark模块间通信。