Master和worker模式
让和hadoop的设计思想是一样的,Master负责分配任务和获取任务的结果,worker是真正处理业务逻辑的。
使用ConcurrentLikedQueue去承载所有的任务,因为会有多个worker会并发修改这个队列。
- public class Task {
- private int id;
- private int price ;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public int getPrice() {
- return price;
- }
- public void setPrice(int price) {
- this.price = price;
- }
- }
- public class Master {
- //1 有一个盛放任务的容器
- private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<Task>();
- //2 需要有一个盛放worker的集合
- private HashMap<String, Thread> workers = new HashMap<String, Thread>();
- //3 需要有一个盛放每一个worker执行任务的结果集合
- private ConcurrentHashMap<String, Object> resultMap = new ConcurrentHashMap<String, Object>();
- //4 构造方法
- public Master(Worker worker , int workerCount){
- worker.setWorkQueue(this.workQueue);
- worker.setResultMap(this.resultMap);
- for(int i = 0; i < workerCount; i ++){
- this.workers.put(Integer.toString(i), new Thread(worker));
- }
- }
- //5 需要一个提交任务的方法
- public void submit(Task task){
- this.workQueue.add(task);
- }
- //6 需要有一个执行的方法,启动所有的worker方法去执行任务
- public void execute(){
- for(Map.Entry<String, Thread> me : workers.entrySet()){
- me.getValue().start();
- }
- }
- //7 判断是否运行结束的方法
- public boolean isComplete() {
- for(Map.Entry<String, Thread> me : workers.entrySet()){
- if(me.getValue().getState() != Thread.State.TERMINATED){
- return false;
- }
- }
- return true;
- }
- //8 计算结果方法
- public int getResult() {
- int priceResult = 0;
- for(Map.Entry<String, Object> me : resultMap.entrySet()){
- priceResult += (Integer)me.getValue();
- }
- return priceResult;
- }
- }
- public class Worker implements Runnable {
- private ConcurrentLinkedQueue<Task> workQueue;
- private ConcurrentHashMap<String, Object> resultMap;
- public void setWorkQueue(ConcurrentLinkedQueue<Task> workQueue) {
- this.workQueue = workQueue;
- }
- public void setResultMap(ConcurrentHashMap<String, Object> resultMap) {
- this.resultMap = resultMap;
- }
- @Override
- public void run() {
- while(true){
- Task input = this.workQueue.poll();
- if(input == null) break;
- Object output = handle(input);
- this.resultMap.put(Integer.toString(input.getId()), output);
- }
- }
- private Object handle(Task input) {
- Object output = null;
- try {
- //处理任务的耗时。。 比如说进行操作数据库。。。
- Thread.sleep(500);
- output = input.getPrice();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return output;
- }
- }
- public class Main {
- public static void main(String[] args) {
- Master master = new Master(new Worker(), 20);
- Random r = new Random();
- for(int i = 1; i <= 100; i++){
- Task t = new Task();
- t.setId(i);
- t.setPrice(r.nextInt(1000));
- master.submit(t);
- }
- master.execute();
- long start = System.currentTimeMillis();
- while(true){
- if(master.isComplete()){
- long end = System.currentTimeMillis() - start;
- int priceResult = master.getResult();
- System.out.println("最终结果:" + priceResult + ", 执行时间:" + end);
- break;
- }
- }
- }
- }
Master和worker模式的更多相关文章
- Spark技术内幕:Client,Master和Worker 通信源码解析
http://blog.csdn.net/anzhsoft/article/details/30802603 Spark的Cluster Manager可以有几种部署模式: Standlone Mes ...
- Spark技术内幕:Client,Master和Worker 通信源代码解析
Spark的Cluster Manager能够有几种部署模式: Standlone Mesos YARN EC2 Local 在向集群提交计算任务后,系统的运算模型就是Driver Program定义 ...
- Apache的prefork模式和worker模式(转)
prefork模式这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求 ...
- Apache的prefork模式和worker模式
prefork模式这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求 ...
- Spark中master与worker的进程RPC通信实现
1.构建master的actor package SparkRPC import akka.actor.{Actor, ActorSystem, Props}import com.typesafe.c ...
- Spark分析之Master、Worker以及Application三者之间如何建立连接
Master.preStart(){ webUi.bind() context.system.scheduler.schedule( millis, WORKER_TIMEOUT millis, se ...
- [PHP] apache在worker模式配置fastcgi使用php-fpm
1.准备: dpkg -L apache2查看所有安装的apache2的应用 a2query -M查看apache2使用的模式 httpd -l旧版本查看当前apache模式 2.查看apache的进 ...
- redis配置master-slave模式
由于云服务器存在闪断现象,项目线上会存在基于redis的功能在闪断时段内出现异常,所以redis需要做master-slave模式.直接上代码: 原单机redis,RedisConnectionFac ...
- Ubuntu下配置Apache的Worker模式
其实Apache本身的并发能力是足够强大的,但是Ubuntu默认安装的是Prefork模式下的Apache.所以导致很多人后面盲目的去 安装lighttpd或者nginx一类替代软件.但是这类软件有一 ...
随机推荐
- Vuejs+axios+SpringMVC 1
原文:https://blog.csdn.net/annghi/article/details/78925668 Vuejs+axios+SpringMVC4.3.7 (一) 2017年12月28日 ...
- dubbo与springcloud对比与面试
对比:具体见此博客: http://www.sohu.com/a/108961261_468650 dubbo:组装机 springcloud:品牌机 打个不恰当的比喻:使用Dubbo构建的微服务架构 ...
- UVAL 7902 2016ECfinal F - Mr. Panda and Fantastic Beasts
题意: 给出n个串,求一个最短的第一个串的子串使它不在其他的n-1个串中出现,若有多个求字典序最小的. Limits: • 1 ≤ T ≤ 42. • 2 ≤ N ≤ 50000. • N ≤ S1 ...
- 2017年Java面试题整理
原文出处:CSDN邓帅 面试是我们每个人都要经历的事情,大部分人且不止一次,这里给大家总结最新的2016年面试题,让大家在找工作时候能够事半功倍. 1.Switch能否用string做参数? a.在 ...
- js 正则表达式 整数或小数
非零开头的整数或小数 /^[1-9][0-9]*([.][0-9]+)?$/ 非零开头的整数或两位小数 /^[1-9][0-9]*([.][0-9]{1,2})?$/ /^[1-9][0-9]*([. ...
- HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识
求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...
- Java并发编程原理与实战四十:JDK8新增LongAdder详解
传统的原子锁AtomicLong/AtomicInt虽然也可以处理大量并发情况下的计数器,但是由于使用了自旋等待,当存在大量竞争时,会存在大量自旋等待,而导致CPU浪费,而有效计算很少,降低了计算效率 ...
- Maven项目中通过profile定义使不同环境使用不同配置信息
profile可以让我们定义一系列的配置信息,然后指定其激活条件.这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果.比如 ...
- 20155210潘滢昊 2016-2017-2 《Java程序设计》第5周学习总结
20155210 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 try with resources 关闭多个资源时用分号分隔 java.lang.Auto ...
- 微服务深入浅出(6)-- 熔断器Hystrix
概念 在分布式系统中,一种不可避免的情况就是某些服务会出现故障,导致依赖他们的其他服务出现远程调度的线程问题(雪崩效应).而Hystrix提供的熔断器,通过隔离服务的访问点,能阻止这种分布式系统中出现 ...