大数据学习——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的环境以及相关使用 ...
随机推荐
- .net core 的跨域
.net core 的跨域问题花了 我很长时间 接下来我简单的描述下解决过程 首先我在前端用jquery的ajax去调用自己的本地接口大致如下 $.ajax({ type:"POST&quo ...
- ABAP跳转屏幕
1.call transaction语句跳转屏幕 '. CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. . 2.调用函数 CALL FUNCTION 'M ...
- <Android 应用 之路> 聚合数据SDK
聚合数据介绍 聚合数据是一个为智能手机开发者,网站站长,移动设备开发人员及图商提供原始数据API服务的综合性云数据平台.包含手机聚合,网站聚合,LBS聚合三部分,其功能类似于Google APIS.[ ...
- servlet config
<webapp> <!--servlet是指编写的Servlet的路径,以及定义别名--> <servlet> <servlet-name>test&l ...
- Python+selenium之fixtures
fixtures即可以表示测试用例的开始和结束,也可以表示测试类和测试模块的开始和结束. import unittest def setUpModule(): print("test mod ...
- JDBC + SAP云平台 = 运行在云端的数据库应用
在前一篇文章JPA + EclipseLink + SAP云平台 = 运行在云端的数据库应用我介绍了如何通过JPA和EclipseLink操作部署在SAP云平台上的HANA数据库实例. 在这篇文章里, ...
- 修改字体篇:css3@font-face@字体转换@浏览器字体支持
@font-face { font-family: 'MyWebFont'; src: url('webfont.eot'); /* IE9 Compat Modes */ src: url('web ...
- C#之winform实现文件拖拽功能【转】
将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了 将一个控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter ...
- lca(最近公共祖先(离线))
转自大佬博客 : https://www.cnblogs.com/JVxie/p/4854719.html LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现 首先是最近公共祖先 ...
- Hicharts图表的使用
Hicharts图表的使用 引用 在4.0之后就不需要jQuery了,z这里是用ajax向后台发送数据 引入js或者CDN,这里采用的是引入js的方式 在Hicarts文件中的index中查看相应的图 ...