Spark的底层通信之Actor

Actor 能够实现并行编程的强大功能,它是基于事件模型的并发机制,Scala是运用消息的发送、接收来实现高并发的,Actor 可以看作是一个个独立的实体,他们之间是毫无关联的。但是,他们可以通过消息来通信。一个 Actor 收到其他 Actor 的信息后,它可以根据需要作出各种相应。消息的类型可以是任意的,消息的内容也可以是任意的(Scala Actor 是 scala 2.10.x 版本及以前版本的 Actor。Scala 在 2.11.x 版本中将 Akka 加入其中,作为其默认的 Actor,老版本的 Actor 已经废弃)akka是以actor为模型的,学习actor是为了akka做准备。

Actor的执行顺序:

1)、首先调用 start()方法启动 Actor

2)、调用 start()方法后其 act()方法会被执行

3)、向 Actor 发送消息

4)、act 方法执行完成之后,程序会调用 exit 方法

akka

Spark 的 RPC 是通过 Akka 类库实现的,Akka 用 Scala 语言开发,基于 Actor并发模型实现,Akka 具有高可靠、高性能、可扩展等特点,使用 Akka 可以轻松实现分布式 RPC 功能

Akka 基于 Actor 模型,提供了一个用于构建可扩展的(Scalable)、弹性的(Resilient)、快速响应的(Responsive)应用程序的平台。Actor 模型:在计算机科学领域,Actor 模型是一个并行计算(ConcurrentComputation)模型,它把 actor 作为并行计算的基本元素来对待:为响应一个接收到的消息,一个 actor 能够自己做出一些决策,如创建更多的 actor,或发送更多的消息,或者确定如何去响应接收到的下一个消息。
在这里插入图片描述
在这里插入图片描述
1、当master与worker都启动后,worker首先会向master注册自己
2、master收到worker的注册信息后 会告诉自己已经注册成功
3、worker收到master的注册信息后,会定期向master汇报自己的状态,包括向master报告心跳信息
4、master收到worker的心跳信息后,定期的更新worker的状态,因为worker在发送心跳的时候会携带心跳发送的时间,master会监测worker发送过来的心跳时间和当前的时间差,如果大于五分钟,则认为worker已死,然后master在分配任务的时候就不会给worker进行发放任务

case class Messge(actor:Actor,msg:String)

class MyActor1 extends Actor {
  def act(): Unit = {
    while(true){
    	receive{
    	case message:Messge => {
    		if(message.msg.equals("hello")){
    			println("hello")
    			message.actor ! "hi~"
    		}else if(message.msg.equals("could we have a date?")){
    			println("could we have a date?")
    			message.actor ! "yes!"
    			
    		}else if(message.msg.equals("ok ~")){
    			println("ok ~")
    			println("Let's go!")
    			
    		}
    	}
    	case _=>{
    		println("default...")
    	}
    	}
    }
  }
}

class MyActor2(actor:Actor) extends Actor {
  
  actor ! Messge(this,"hello")
  
  def act(): Unit = {
    while(true){
    	receive{
    	case s:String => {
    		if(s.equals("hi~")){
    			println("hi~")
    			actor ! Messge(this,"could we have a date?")
    		}else if(s.equals("yes!")){
    			println("yes!")
    			actor ! Messge(this,"ok ~")
    		}
    	}
    	case _=>{
    		println("default...")
    	}
    	}
    }
  }
}

object ActorExample {
  def main(args: Array[String]): Unit = {
       val actor1 = new MyActor1() 
		val actor2 = new MyActor2(actor1) 
    actor1.start()
    actor2.start()
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_38653290/article/details/86547280
今日推荐