Message
package com.bigdata.akka.yarn
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
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
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
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 = {
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)
}
}