Spark内部通信/akka

Spark的Client、Master、Worker之间的通信使用akka完成。

模块之间的通信机制可以分为基于消息的传递和基于资源共享的同步机制。

在Spak中的Client、Master和Worker实际上都是一个actor。


akka是一个基于actor模型的并发处理框架。

Actor模型

在java中,角色是通过继承UntypedActor类及实现onReceive方法来实现的。

所有对象都可以是Actor。Actor之间完全独立。Actor之间只有发送信息这一种通信方式。消息通信的方式看似不如直接方法调用来的直接,但是大量的消息可以同时执行。同时,消息让Actor之间解耦。
Actor执行的唯一事件是接收到一个消息,而一个Actor很可能会做多件事情。模型需要一种消息分发机制,把消息分发到相应的代码段,并指定各自需要的参数。

每一个Actor都拥有自己的属性和操作、邮箱、子Actor和一个监管策略,所有这些包含在一个Actor Reference里。
Actor能创建更多的Actor,发送更多的消息。
Actor模型内在设计是并行的、异步的。
Actor之间不共享状态,如果要获取其他actor的信息,必须通过消息请求方式。交换的信息存放在接收方的邮箱中。

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

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

初始行为

actor对象在创建时所定义的初始行为是特殊的,当actor重启时会恢复这个初始行为。
一个actor的初始行为在构造方法之前就被抽取出来了,如果希望初始行为受到成员状态的影响,需要在构造方法中调用become方法。

邮箱

每个actor有且只有一个邮箱,所有的发来的消息都在邮箱里排队。排队按照发送操作的时间顺序来进行。从同一个actor发送多个消息到相同的actor,消息会按照发送的顺序排队。
可以设置邮箱中消息处理方式,默认的是FIFO:actor处理消息的顺序与消息入队列的顺序一致。如果应用需要对某些消息进行优先处理,设置队列的算法,消息的处理顺序由队列的算法决定。

消息

Actor在消息内部指定了接收消息的Actor地址。Actor可以用自己的地址发送信息,相当于自己接收到自己发送的消息,驱动自己的状态。
消息传递是非阻塞和异步的,其机制是邮件队列。

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


Actor模型的缺点:
1.由于Actor能够动态创建其他Actor,这种行为使得系统的行为动态变化,很难控制。一个actor可能永远陷入接收和处理消息的循环中。
2.异步消息对于某些方式和算法并不合适。

子Actor

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

监管策略

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

监管描述的是actor之间的关系:监管者将任务委托给下属并对下属的失败状况进行响应。当一个下属出现一个异常时,它会将自己和所有的下属挂起然后向自己的监管者发送一个提示失败的信息。监管者根据所监管工作的性质和失败的性质给出答复。
(1)让下属继续执行,保持下属当前的内部状态。
(2)永久终止下属
(3)将失败沿监管树向上传递
(4)重新启动下属,清除下属的内部状态
让actor继续执行同时会继续执行它的下属;重启一个actor也必须重启它的下属;终止一个actor会终止它所有的下属。每个监管者都有相应的一个函数,将所有可能的失败原因归结到上述四种选择之一。
Actor只能由其他的Actor创建,而顶部的actor是由库来提供的。

Actor终止

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

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()。

Actor 路径

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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值