大数据学习——akka自定义RPC

实现

package cn.itcast.akka
import akka.actor.{Actor, ActorSystem, Props}
import akka.actor.Actor.Receive
import com.typesafe.config.ConfigFactory
import scala.collection.mutable
import scala.concurrent.duration._
class Master(val host: String, val port: Int) extends Actor {
//保存WorkerID 到 WorkerInfo的映射
val idToWorker = new mutable.HashMap[String, WorkerInfo]()
//保存所的WorkerInfo信息
val workers = new mutable.HashSet[WorkerInfo]()
val CHECK_INTERVAL = 15000
override def preStart(): Unit = {
//导入隐式转换
import context.dispatcher
context.system.scheduler.schedule(0 millis, CHECK_INTERVAL millis, self, CheckTimeOutWorker)
}
override def receive: Receive = {
//Worker发送个Mater的注册消息
case RegisterWorker(workerId, cores, memory) => {
if (!idToWorker.contains(workerId)) {
//封装worker发送的信息
val workerInfo = new WorkerInfo(workerId, cores, memory)
//保存workerInfo
idToWorker(workerId) = workerInfo
workers += workerInfo
//Master向Worker反馈注册成功的消息
sender ! RegisteredWorker(s"akka.tcp://${Master.MASTER_SYSTEM}@$host:$port/user/${Master.MASTER_NAME}")
}
}
//Worker发送给Master的心跳信息
case Heartbeat(workerId) => {
if (idToWorker.contains(workerId)) {
val workerInfo = idToWorker(workerId)
val currentTime = System.currentTimeMillis()
//更新上一次心跳时间
workerInfo.lastHeartbeatTime = currentTime
}
}
//检测超时的Worker
case CheckTimeOutWorker => {
val currentTime = System.currentTimeMillis()
val deadWorkers: mutable.HashSet[WorkerInfo] = workers.filter(w => currentTime - w.lastHeartbeatTime > CHECK_INTERVAL)
// for(w <- deadWorkers) {
// idToWorker -= w.id
// workers -= w
// }
deadWorkers.foreach(w => {
idToWorker -= w.id
workers -= w
})
println("alive worker size : " + workers.size)
}
}
}
object Master {
val MASTER_SYSTEM = "MaterActorSystem"
val MASTER_NAME = "Master"
def main(args: Array[String]) {
// val host = args(0)
// val port = args(1).toInt
val host = "127.0.0.1"
val port = 8888
val confStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
""".stripMargin
val conf = ConfigFactory.parseString(confStr)
//ActorSystem是单例的,用于创建Acotor并监控actor
val actorSystem = ActorSystem(MASTER_SYSTEM, conf)
//通过ActorSystem创建Actor
actorSystem.actorOf(Props(new Master(host, port)), MASTER_NAME)
actorSystem.awaitTermination()
}
}
package cn.itcast.akka trait Message extends Serializable //Worker -> Master
case class RegisterWorker(id: String, cores: Int, memory: Int) extends Message //Master -> Worker
case class RegisteredWorker(masterUrl: String) extends Message //Worker -> Master
case class Heartbeat(id: String) extends Message //Worker internal message
case object SendHeartbeat //Master internal message
case object CheckTimeOutWorker
package cn.itcast.akka import java.util.UUID
import akka.actor.{Actor, ActorSelection, ActorSystem, Props}
import com.typesafe.config.ConfigFactory import scala.concurrent.duration._ class Worker(val cores: Int, val memory: Int, val masterHost: String, val masterPort: Int) extends Actor { //Master的引用
var master: ActorSelection = _
//Worker的ID
val workerId = UUID.randomUUID().toString
//masterUrl
var masterUrl: String = _ val HEARTBEAT_INTERVAL = 10000 //preStart在构造器之后receive之前执行
override def preStart(): Unit = {
//首先跟Master建立连接
master = context.actorSelection(s"akka.tcp://${Master.MASTER_SYSTEM}@$masterHost:$masterPort/user/${Master.MASTER_NAME}")
//通过master的引用向Master发送注册消息
master ! RegisterWorker(workerId, cores, memory)
} override def receive: Receive = {
//Master发送给Worker注册成功的消息
case RegisteredWorker(masterUrl) => {
this.masterUrl = masterUrl
//启动定时任务,向Master发送心跳
//导入隐式转换
import context.dispatcher
context.system.scheduler.schedule(0 millis, HEARTBEAT_INTERVAL millis, self, SendHeartbeat)
} case SendHeartbeat => {
//向Master发送心跳
master ! Heartbeat(workerId)
}
}
} object Worker {
def main(args: Array[String]) { //Worker的地址和端口
// val host = args(0)
// val port = args(1).toInt
// val cores = args(2).toInt
// val memory = args(3).toInt
val host = "127.0.0.1"
val port = 9999
val cores = 8
val memory = 1024 //Master的地址和端口
// val masterHost = args(4)
// val masterPort = args(5).toInt
val masterHost = "127.0.0.1"
val masterPort = 8888 val confStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
""".stripMargin
val conf = ConfigFactory.parseString(confStr)
//单例的ActorSystem
val actorSystem = ActorSystem("WorkerActorSystem", conf)
//通过actorSystem来创建Actor
val worker = actorSystem.actorOf(Props(new Worker(cores, memory, masterHost, masterPort)), "Worker")
actorSystem.awaitTermination()
}
}
package cn.itcast.akka
class WorkerInfo(val id: String, val cores: Int, val memory: Int) {
//TODO
var lastHeartbeatTime: Long = _
}


大数据学习——akka自定义RPC的更多相关文章
- 大数据学习——akka学习
架构图 重要类介绍 ActorSystem 在Akka中,ActorSystem是一个重量级的结构,他需要分配多个线程,所以在实际应用中,ActorSystem通常是一个单例对象,我们可以使用这个Ac ...
- 大数据学习——hadoop的RPC框架
项目结构 服务端代码 test-hadoop-rpc pom.xml <?xml version="1.0" encoding="UTF-8"?> ...
- 大数据学习day29-----spark09-------1. 练习: 统计店铺按月份的销售额和累计到该月的总销售额(SQL, DSL,RDD) 2. 分组topN的实现(row_number(), rank(), dense_rank()方法的区别)3. spark自定义函数-UDF
1. 练习 数据: (1)需求1:统计有过连续3天以上销售的店铺有哪些,并且计算出连续三天以上的销售额 第一步:将每天的金额求和(同一天可能会有多个订单) SELECT sid,dt,SUM(mone ...
- 大数据学习:storm流式计算
Storm是一个分布式的.高容错的实时计算系统.Storm适用的场景: 1.Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中. 2.由于Storm的处理组件都是分布式的, ...
- 大数据学习笔记——Hadoop编程实战之HDFS
HDFS基本API的应用(包含IDEA的基本设置) 在上一篇博客中,本人详细地整理了如何从0搭建一个HA模式下的分布式Hadoop平台,那么,在上一篇的基础上,我们终于可以进行编程实操了,同样,在编程 ...
- 大数据学习笔记——Linux完整部署篇(实操部分)
Linux环境搭建完整操作流程(包含mysql的安装步骤) 从现在开始,就正式进入到大数据学习的前置工作了,即Linux的学习以及安装,作为运行大数据框架的基础环境,Linux操作系统的重要性自然不言 ...
- 大数据学习笔记——Java篇之集合框架(ArrayList)
Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...
- 大数据学习路线,来qun里分享干货,
一.Linux lucene: 全文检索引擎的架构 solr: 基于lucene的全文搜索服务器,实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面. 推荐一个大数据学习群 ...
- 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)
引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...
随机推荐
- JavaScript中var a=b=c=d的发现
看了别人的博客随手记录下 先看一下以下的代码 var a=1,b=2,c=3; (function(){ var a=b=1; })(); console.log(a); console.log(b) ...
- CDN加速服务
CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一般的CDN公共库都会包含全球所有最流行的开源JavaScrip ...
- Vmware 虚拟硬盘 合并多个分割文件
有时,当我们创建虚拟机vmware里面的应用程序,我们可能会选择创建分割的虚拟磁盘中的多个文件2 GB的文件,这是为了提高复制过程,主要用于存储虚拟机文件系统不支持创建更大的文件. 如果我们需要将它转 ...
- JFinal视频教程-JFnal学院分享课
最近JFinal学院出了JFinal视频教程分享课,请笑纳~ 课程列表: 1.[JFinal版]微信小程序富文本渲染解决方案-html2wxml4J分享课 这个课程主要讲的是使用基于JFinal开发的 ...
- Nginx开启Gzip压缩提高页面加载速度
本文转自http://www.veryhuo.com/a/view/51706.html,如有侵权,请及时联系转载人删除! 在实际运维中,为了提高web页面的访问加载速度,一般会把静态资源(比如js. ...
- 会写网页 就会写手机APP #2-- 范例修正 , Hybrid Mobile Apps for ASP.NET Developers (Apache Cordova)
原文出处:会写网页 就会写手机APP #2-- 范例修正 , Hybrid Mobile Apps for ASP.NET Developers (Apache Cordova) 这是我的文章备份 ...
- BZOJ 1137: [POI2009]Wsp 岛屿 半平面交
1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 165 Solved: ...
- BFS 简单思想以及代码
BFS(广搜思想) 广度优先搜索 广度优先搜索是图论的搜索算法之一,以下便进行简单叙述 对于每一个顶点来说,都存在着三种颜色 白色,灰色,黑色 而对于每个顶点,都有三种数据类型 颜色类型,前驱或者父节 ...
- 谷歌浏览器 加安全地址 快捷方式加参数 chrome
--unsafely-treat-insecure-origin-as-secure="http://192.168.43.17:8080"
- Luogu P1666 前缀单词
校内资格赛题目,差点高一就要\(\tt{AFO}\)了 30分思路 对30%的数据,满足$1≤n≤10 $ 所以我们可以子集枚举,实际得分40pts #include<iostream> ...