基于akka模拟yarn启动和注册还有心跳

Message

package com.bigdata.akka.yarn

/**
 * Copyright (c) 2020 bigdata ALL Rights Reserved
 * Project: learning
 * Package: com.bigdata.akka.yarn
 * Version: 1.0
 *
 * @author qingzhi.wu 2020/9/29 14:56
 *
 */
//注册消息
case class RegisterNodeManager( nodemanagerid:String, memory:Int, cpu:Int)

//注册完成消息
case class RegisteredNodeManager( resourcemanagerhostname:String)

//心跳消息
case class Heartbeat(nodemanagerid:String)

class NodeManagerInfo(val nodemanagerid:String,val memory:Int,val cpu:Int){
  var lastHertBeatTime:Long = _
  override def toString:String = {
    nodemanagerid + "," +memory + ","+cpu
  }
}

case object SendMessage
case object CheckTimeOut

Constant

package com.bigdata.akka.yarn

/**
 * Copyright (c) 2020 bigdata ALL Rights Reserved
 * Project: learning
 * Package: com.bigdata.akka.yarn
 * Version: 1.0
 *
 * @author qingzhi.wu 2020/9/29 14:54
 *
 */
object Constant {
  val RMAS = "MyResourceManagerActorSystem"
  val RMA = "MyResourceManagerActor"
  val NMAS = "MyNodeManagerActorSystem"
  val NMA = "MyNodeManagerActor"

}

MyResourceManager

package com.bigdata.akka.yarn

import akka.actor.{Actor, ActorSystem, Props}
import com.typesafe.config.ConfigFactory

import scala.collection.mutable

/**
 * Copyright (c) 2020 bigdata ALL Rights Reserved
 * Project: learning
 * Package: com.bigdata.akka.yarn
 * Version: 1.0
 *
 * @author qingzhi.wu 2020/9/29 15:06
 *
 */
class MyResourceManager(var hostname: String, var port: Int) extends Actor {

  private var id2nodemanagerinfo = new mutable.HashMap[String, NodeManagerInfo]
  private var nodeManagerInfoes = new mutable.HashSet[NodeManagerInfo]()


  override def preStart(): Unit = {
    import scala.concurrent.duration._
    import context.dispatcher
    context.system.scheduler.schedule(0 millis, 5000 millis, self, CheckTimeOut)
  }


  override def receive: Receive = {
    case RegisterNodeManager(nodemanagerid, memory, cpu) => {
      val nodeManagerInfo = new NodeManagerInfo(nodemanagerid, memory, cpu)
      println(s"节点  ${nodemanagerid} 上线")

      id2nodemanagerinfo.put(nodemanagerid, nodeManagerInfo)
      nodeManagerInfoes += nodeManagerInfo

      sender() ! RegisteredNodeManager(hostname + ":" + port)

    }
    case Heartbeat(nodemanagerid)=>{
      val currentTime = System.currentTimeMillis()
      val nodeManagerInfo = id2nodemanagerinfo(nodemanagerid)
      nodeManagerInfo.lastHertBeatTime = currentTime
      id2nodemanagerinfo(nodemanagerid) = nodeManagerInfo
      nodeManagerInfoes += nodeManagerInfo
    }
    case CheckTimeOut=>{
      val currentTime = System.currentTimeMillis()
      nodeManagerInfoes.filter(
        nm=>{
          val bool = currentTime-nm.lastHertBeatTime>150000
          if(bool){
            println(s"节点 ${nm.nodemanagerid} 下线")
          }
          bool
        }

      ).foreach(deadname=>{
        nodeManagerInfoes-=deadname
        id2nodemanagerinfo.remove(deadname.nodemanagerid)
      })
      println("当前注册成功的节点数" + nodeManagerInfoes.size + "\t分别是:" + nodeManagerInfoes.map(x => x.toString)
        .mkString(","));

    }

  }

}

object MyResourceManager{
  def main(args: Array[String]): Unit = {
    val str =
      s"""
         |akka.actor.provider = "akka.remote.RemoteActorRefProvider"
         |akka.remote.netty.tcp.hostname = localhost
         |akka.remote.netty.tcp.port = 6789
      """.stripMargin
    val conf = ConfigFactory.parseString(str)

    val actorSystem = ActorSystem(Constant.RMAS,conf)

    actorSystem.actorOf(Props(new MyResourceManager("loalhost",6789)),Constant.RMA)

  }
}

MyNodeManager

package com.bigdata.akka.yarn

import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory

/**
 * Copyright (c) 2020 bigdata ALL Rights Reserved
 * Project: learning
 * Package: com.bigdata.akka.yarn
 * Version: 1.0
 *
 * @author qingzhi.wu 2020/9/29 16:14
 *
 */
class MyNodeManager(val nmhostname: String, val rmHostName: String, rmPort: Int
                    , val memory: Int, val cpu: Int
                   ) extends Actor {
  val nmId:String = nmhostname
  var rmRef:ActorSelection = _

  override def preStart(): Unit = {
    //tcp
    val path = s"akka.tcp://${Constant.RMAS}@${rmHostName}:${rmPort}/user/${Constant.RMA}"
    import scala.concurrent.duration._
    import context.dispatcher
    context.system.scheduler.schedule(0 millis, 1000 millis, self, RegisterNodeManager)
     rmRef = context.actorSelection(path)
    println(nmId +"正在注册!")
    rmRef ! RegisterNodeManager(nodemanagerid = nmId, memory = memory, cpu = cpu)
    rmRef ! Heartbeat(nmId)

  }

  override def receive: Receive = {
    case RegisteredNodeManager(masterURL)=>{
      println(masterURL)
      import scala.concurrent.duration._
      import context.dispatcher
      context.system.scheduler.schedule(0 millis, 1000 millis, self, SendMessage)
    }
    case SendMessage =>{
      println(Thread.currentThread().getId)
    }
  }
}
object MyNodeManager{
  def main(args: Array[String]): Unit = {
    val HOSTNAME = "localhost"
    val RM_HOSTNAME = "localhost"
    val RM_PORT = 6789
    val NODEMANAGER_MEMORY = 3
    val NODEMANAGER_CORE = 3
    var NODEMANAGER_PORT = 3490
    var NMHOSTNAME = "localhost"
    val str =
      s"""
         |akka.actor.provider = "akka.remote.RemoteActorRefProvider"
         |akka.remote.netty.tcp.hostname =${HOSTNAME}
         |akka.remote.netty.tcp.port=${NODEMANAGER_PORT}
      """.stripMargin
    val conf = ConfigFactory.parseString(str)
    val actorSystem = ActorSystem(Constant.NMAS, conf)
    actorSystem.actorOf(Props(new MyNodeManager(NMHOSTNAME, RM_HOSTNAME, RM_PORT, NODEMANAGER_MEMORY, NODEMANAGER_CORE)), Constant.NMA)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值