vlambda博客
学习文章列表

「大数据」(七十八)Spark之通信模块

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[78]篇文章,欢迎阅读和收藏】

1 基本概念

Spark 在模块间通信使用的是出色的高效的 AKKa 框架。Akka 是 JAVA 虚拟机 JVM 平台上构建高并发、分布式和容错应用的 工具包 和 运行时 。Akka 用 Scala 语言写成,同时提供了 Scala 和 JAVA 的开发接口。Akka 处理并发的方法基于 Actor 模型。在 Akka 里, Actor 之间通信的唯一机制就是消息传递 .

Spark 通信模块主要分两点:

l AKKA 通信框架

l Client 、 Master 和 Worker 间的通信

模块之间的通信机制可以分为基于消息的传递和基于资源共享的同步机制。在 Spak 中的 Client 、 Master 和 Worker 实际上都是一个 actor 。

2 术语解释


3 Spark 通信机制介绍

3.1 Actor 模型

所有对象都可以是 Actor , Actor 之间完全独立。Actor 之间只有发送信息这一种通信方式。消息通信的方式看似不如直接方法调用来的直接,但是大量的消息可以同时执行。同时,消息让 Actor 之间解耦。

Actor 执行的唯一事件是接收到一个消息,而一个 Actor 很可能会做多件事情。模型需要一种消息分发机制,把消息分发到相应的代码段,并指定各自需要的参数。

每一个 Actor 都拥有自己的属性和操作、邮箱、子 Actor 和一个监管策略,所有这些包含在一个 Actor Reference 里。


Actor 能创建更多的 Actor ,发送更多的消息。Actor 模型内在设计是并行的、异步的。Actor 之间不共享状态,如果要获取其他 actor 的信息,必须通过消息请求方式。交换的信息存放在接收方的邮箱中。

每个 actor 有且仅有一个监管者,就是创建它的那个 actor 。如果一个 actor 对某种状况无法进行处理,它会发送相应的失败消息给它的监管者请求帮助,这样递归结构使得失败能够在正确的层次进行处理。

一个 actor 对象需要与外界隔离开才能从 actor 模型中获益。所以 actor 是以 actor 引用的形式展现给外界的, actor 引用可以被自由的无限制地传递。

3.2 初始行为

actor 对象在创建时所定义的初始行为是特殊的,当 actor 重启时会恢复这个初始行为。

一个 actor 的初始行为在构造方法之前就被抽取出来了,如果希望初始行为受到成员状态的影响,需要在构造方法中调用 become 方法 。

3.3 邮箱

每个 actor 有且只有一个邮箱,所有的发来的消息都在邮箱里排队。排队按照发送操作的时间顺序来进行。从同一个 actor 发送多个消息到相同的 actor ,消息会按照发送的顺序排队。

可以设置邮箱中消息处理方式,默认的是 FIFO :actor 处理消息的顺序与消息入队列的顺序一致。如果应用需要对某些消息进行优先处理,设置队列的算法,消息的处理顺序由队列的算法决定。

3.4 消息

一般而言,每个 Actor 都在一个独立线程上处理消息。

Actor 模型的缺点:

1) 由于 Actor 能够动态创建其他 Actor ,这种行为使得系统的行为动态变化,很难控制。一个 actor 可能永远陷入接收和处理消息的循环中。

2) 异步消息对于某些方式和算法并不合适。

3.5 子 Actor

子 Actor 列表维护在 actor 的上下文中, actor 可以访问它。对列表的更改是通过创建 context.actorOf() 或者停止 context.stop(child) 子 actor 来实现的,这些更改会立刻生效。

3.6 监管策略

一旦 actor 被创建,它的监管策略便不能被修改。每个 actor 只有唯一的策略。如果一个 actor 的子 actor 应用了不同的策略,这些子 actor 按照相同的策略来进行分组。

监管描述的是 actor 之间的关系:监管者将任务委托给下属并对下属的失败状况进行响应。当一个下属出现一个异常时,它会将自己和所有的下属挂起然后向自己的监管者发送一个提示失败的信息。监管者根据所监管工作的性质和失败的性质给出答复。

(1) 让下属继续执行,保持下属当前的内部状态。

(2) 永久终止下属

(3) 将失败沿监管树向上传递

(4) 重新启动下属,清除下属的内部状态

让 actor 继续执行同时会继续执行它的下属;重启一个 actor 也必须重启它的下属;终止一个 actor 会终止它所有的下属。每个监管者都有相应的一个函数,将所有可能的失败原因归结到上述四种选择之一。

Actor 只能由其他的 Actor 创建,而顶部的 actor 是由库来提供的。

3.7 Actor 终止

如果一个 actor 终止后不能用重启来解决,就会被停止并且释放其资源,将它邮箱中所有未处理的消息放到系统的“死信邮箱”。而 actor 引用中的邮箱会被一个系统邮箱所代替,系统邮箱会将所有新的消息重定向到“排水沟”。这些操作并不能保证一定完成。

3.8 Actor 引用

Actor 引用是 ActorRef 的子类。每个 actor 通过 self 来访问自己的本地引用,在发送给其它 actor 的消息中也缺省包含这个引用。在消息处理的过程中, actor 可以通过 sender 来访问到当前信息的发送者的引用。

向一个 actor 引用发送消息,会在 actor 系统树中从根开始一层一层从父向子 actor 发送消息,直到消息到达目标或是出现某种失败。

一个 actor 系统通常是在根 actor 上使用 ActorSystem.actorOf 创建 actor 。

ActorSystem system=ActorSystem.create("systemname");

ActorRef actor=system.actorOf(Props.create(xxx.class));

通过具体的路径来查找 actor,ActorSystem.actorFor() 。

3.9 Actor 路径

沿着子 actor 到父 actor 的监管链一直到 actor 系统的根存在一条唯一的 actor 名字序列。一个 actor 可能通过不同的路径访问到,除了原始路径外,其它的路径都包含到 actor 实际的监管祖先链的转换方法。