spark入门学习(2)---利用akka建立基于心跳基础的通信框架
来源:互联网 发布:此事难知pdf 编辑:程序博客网 时间:2024/05/07 05:00
1、架构图
2、业务要求
通信业务逻辑:
首先启动master,然后启动所有的worker
1.worker启动后,在preStart方法中与master建立连接,向master发送注册,将worker的信息通过case class封装起来发送给master
2.master接受到worker的注册消息后
3、代码实现
3.1、master
Master.scala
package org.tianjun.rpcimport akka.actor.{Props, ActorSystem, Actor}import com.typesafe.config.ConfigFactoryimport scala.collection.mutableimport scala.concurrent.duration._/** * 基于akka的rpc * Created by tianjun on 2017/1/11 0011. */class Master(val host:String,val port:Int) extends Actor{// println("constructor invoked!") //workerId-->workerInfo val idToWorker = new mutable.HashMap[String,WorkInfo]() //workerINfo val workes = new mutable.HashSet[WorkInfo] //超时检测的间隔 val CHECK_INTERVAL = 15000 override def preStart(): Unit = { println("preStart invoked!") //导入隐式转换 import context.dispatcher context.system.scheduler.schedule(0 millis,CHECK_INTERVAL millis,self,CheckTimeOutWorker) } override def receive: Receive = { case RegisterWorker(id,memory,cores) => { //判断是否已经注册 if(!idToWorker.contains(id)){ //没有注册,就把worker的信息封装保存到内存中 val workerInfo = new WorkInfo(id,memory,cores) idToWorker(id) = workerInfo workes+=workerInfo sender ! RegisteredWorker(s"akka.tcp://MasterSystem@$host:$port/user/Master") } } case HeartBeat(id)=>{ if(idToWorker.contains(id)){ val workInfo = idToWorker(id) //报活 val currentTime = System.currentTimeMillis() workInfo.lastHearBeatTime = currentTime } } case CheckTimeOutWorker => { val currentTime = System.currentTimeMillis() val toRemove = workes.filter(x=>currentTime-x.lastHearBeatTime > CHECK_INTERVAL) for(w <- toRemove){ workes -= w idToWorker -= w.id } println(workes.size) } }}object Master{ def main(args: Array[String]) { val host = args(0) val port = args(1).toInt val configStr = s""" |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = "$host" |akka.remote.netty.tcp.port = "$port" """.stripMargin val config = ConfigFactory.parseString(configStr) //ActorSystem老大,辅助创建和监控actor,它是单例的 val actorSystem = ActorSystem("MasterSystem",config) val master = actorSystem.actorOf(Props(new Master(host,port)),"Master") actorSystem.awaitTermination() }}
3.2、worker
Worker.scala
package org.tianjun.rpcimport akka.actor.{Props, ActorSystem, Actor}import com.typesafe.config.ConfigFactoryimport scala.collection.mutableimport scala.concurrent.duration._/** * 基于akka的rpc * Created by tianjun on 2017/1/11 0011. */class Master(val host:String,val port:Int) extends Actor{// println("constructor invoked!") //workerId-->workerInfo val idToWorker = new mutable.HashMap[String,WorkInfo]() //workerINfo val workes = new mutable.HashSet[WorkInfo] //超时检测的间隔 val CHECK_INTERVAL = 15000 override def preStart(): Unit = { println("preStart invoked!") //导入隐式转换 import context.dispatcher context.system.scheduler.schedule(0 millis,CHECK_INTERVAL millis,self,CheckTimeOutWorker) } override def receive: Receive = { case RegisterWorker(id,memory,cores) => { //判断是否已经注册 if(!idToWorker.contains(id)){ //没有注册,就把worker的信息封装保存到内存中 val workerInfo = new WorkInfo(id,memory,cores) idToWorker(id) = workerInfo workes+=workerInfo sender ! RegisteredWorker(s"akka.tcp://MasterSystem@$host:$port/user/Master") } } case HeartBeat(id)=>{ if(idToWorker.contains(id)){ val workInfo = idToWorker(id) //报活 val currentTime = System.currentTimeMillis() workInfo.lastHearBeatTime = currentTime } } case CheckTimeOutWorker => { val currentTime = System.currentTimeMillis() val toRemove = workes.filter(x=>currentTime-x.lastHearBeatTime > CHECK_INTERVAL) for(w <- toRemove){ workes -= w idToWorker -= w.id } println(workes.size) } }}object Master{ def main(args: Array[String]) { val host = args(0) val port = args(1).toInt val configStr = s""" |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = "$host" |akka.remote.netty.tcp.port = "$port" """.stripMargin val config = ConfigFactory.parseString(configStr) //ActorSystem老大,辅助创建和监控actor,它是单例的 val actorSystem = ActorSystem("MasterSystem",config) val master = actorSystem.actorOf(Props(new Master(host,port)),"Master") actorSystem.awaitTermination() }}
RemoteMessage.scala
package org.tianjun.rpc/** * 跨进程通信 * Created by tianjun on 2017/1/11 0011. */trait RemoteMessage extends Serializable//Worker-->Mastercase class RegisterWorker(id:String,memory:Int,cores:Int) extends RemoteMessage//worker->mastercase class HeartBeat(id:String)//Master-->Workercase class RegisteredWorker(masterUrl:String) extends RemoteMessage//master->selfcase object CheckTimeOutWorker//worker-->selfcase object SendHeartbeat
WorkInfo.scala
package org.tianjun.rpc/** * Created by tianjun on 2017/1/11 0011. */class WorkInfo(val id:String,val memory:Int,cores:Int) { //TODO 上一次心跳 var lastHearBeatTime : Long = _}
4、运行
master:
preStart invoked!011
worker:
akka.tcp://MasterSystem@192.168.64.1:8888/user/Mastersend heartbeat to mastersend heartbeat to mastersend heartbeat to master
0 0
- spark入门学习(2)---利用akka建立基于心跳基础的通信框架
- spark入门学习(1)---利用akka建立最基础的通信框架
- Spark入门到精通视频学习资料--第四章:基于Spark的流处理框架Spark Streaming(2讲)
- Spark内部通信/akka
- Spark为何使用Netty通信框架替代Akka
- 通信框架AKKA介绍
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
- JAVA NIO异步通信框架MINA选型和使用的几个细节(概述入门,UDP, 心跳)
- Spark:Akka入门初窥
- 基于Spark的图计算框架 GraphX 入门介绍
- Java心跳消息的实现,hadoop的rpc基础(心跳篇)下一篇(rpc通信篇)
- akka基础学习
- Spark:Akka实现简单RPC通信
- Gatling-基于Scala,Akka&Netty的性能测试框架
- 基于Windows Socket 的网络通信中的心跳机制原理
- 基于Windows Socket 的网络通信中的心跳机制原理
- caffe 中Blobs数据结构的Python中的调用方式总结
- Dreamweaver CC“配置错误 请卸载并重新安装该产品”解决办法
- ZooKeeper安装指南
- Java有Stop按钮退出正在运行的程序
- Linux 定时器3
- spark入门学习(2)---利用akka建立基于心跳基础的通信框架
- 简单JS代码为你的网站添加智能机器人
- .net中radiobutton控件获得TAB焦点并选中
- 入职学习(2)--一个程序员的成长史(22)
- atom 插件实现
- 农历28,我等你
- 2016书单总结
- openfire之SSL认证
- Log4j 配置