Master-Worker集群计算demo
Task为要执行的任务实体类:
package com.viewhigh.mdop.bi.test; /**
* Created by zzq on 2017/5/11.
*/
public class Task {
private int id;
private String name; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public Task setName(String name) {
this.name = name;
return this;
}
}
Master为分布式计算代理类,负责创建多个工作线程来处理任务,并将结果汇总,内部维护任务队列,结果map集合和线程map集合:
package com.viewhigh.mdop.bi.test; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue; /**
* Created by zzq on 2017/5/11.
*/
public class Master {
//任务队列
private Queue<Task> workerQueue = new LinkedBlockingQueue(); //工作线程集合
private Map<Integer, Thread> workerMap = new HashMap(); //工作线程返回结果
private Map<Integer, Object> workerResult = new ConcurrentHashMap(); public Map<Integer, Object> getWorkerResult() {
return workerResult;
} public Master(Worker worker) {
int currProcessors = Runtime.getRuntime().availableProcessors();
System.out.println("当前机器最大线程数:" + currProcessors); worker.setWorkerQueue(workerQueue);
worker.setWorkerResultMap(workerResult); for (int i = 0; i < currProcessors; i++) {
workerMap.put(i, new Thread(worker));
}
} public void submitTask(Task task) {
workerQueue.add(task);
} public void submitTask(List<Task> taskList) {
for (Task task : taskList)
workerQueue.add(task);
} public void execute() {
for (Thread thread : workerMap.values()) {
thread.start();
}
} public boolean finish() {
for (Thread thread : workerMap.values()) {
if (thread.getState() != Thread.State.TERMINATED)//线程未终止
return false;
}
return true;
}
}
Worker承担计算和计算结果汇总,处理队列中的Task:
package com.viewhigh.mdop.bi.test; import java.util.Map;
import java.util.Queue; /**
* Created by zzq on 2017/5/11.
*/
public class Worker implements Runnable { private Queue<Task> workerQueue;
private Map<Integer, Object> workerResult; @Override
public void run() {
while (true) {
Task task = workerQueue.poll(); if (task == null) break; Object ret = handle(task);
workerResult.put(task.getId(), ret);
}
} public Object handle(Task task) {
try {
Thread.sleep(1000);
return task.getName();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
} public void setWorkerQueue(Queue<Task> workerQueue) {
this.workerQueue = workerQueue;
} public void setWorkerResultMap(Map<Integer, Object> workerResult) {
this.workerResult = workerResult;
}
}
测试类:
package com.viewhigh.mdop.bi.test; import org.junit.Test; import java.util.ArrayList;
import java.util.List; import static org.junit.Assert.*; /**
* Created by zzq on 2017/5/11.
*/
public class MasterTest {
@Test
public void submitTask() throws Exception {
List<Task> list = new ArrayList(); for (int i = 0; i < 10; i++) {
Task task1 = new Task();
task1.setId(i);
task1.setName("_序号_:" + Integer.toString(i));
list.add(task1);
} Master master = new Master(new Worker());
master.submitTask(list); master.execute();
long currTime = System.currentTimeMillis(); while (!master.finish()) {
// System.out.println("执行中。。。");
} // for (Object a : master.getWorkerResult().values())
// System.out.println((String) a);
System.out.println("消耗的时间:" + Long.toString(System.currentTimeMillis() - currTime));
} }
Master-Worker集群计算demo的更多相关文章
- RDD:基于内存的集群计算容错抽象(转)
原文:http://shiyanjun.cn/archives/744.html 该论文来自Berkeley实验室,英文标题为:Resilient Distributed Datasets: A Fa ...
- RDD:基于内存的集群计算容错抽象
转载自:http://shiyanjun.cn/archives/744.html 摘要 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Dat ...
- ActiveMQ使用Zookeeper+LevelDb配置Master/Slave集群
前言: 本文介绍的AMQ集群是Master-Slave模式的,官网介绍三种方案: (1)基于共享文件系统的,(2)基于JDBC,(3)基于可复制的LevelDB. 关于三种方式的对比网上已经有很多,本 ...
- Spark 论文篇-Spark:工作组上的集群计算的框架(中英双语)
论文内容: 待整理 参考文献: Spark: Cluster Computing with Working Sets. Matei Zaharia, Mosharaf Chowdhury, Micha ...
- Spark 论文篇-RDD:一种为内存化集群计算设计的容错抽象(中英双语)
论文内容: 待整理 参考文献: Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster C ...
- Dubbo入门实例 本地伪集群测试Demo
1. 概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提 ...
- RocketMQ集群部署记录
RocketMQ集群部署记录 #引用 https://cloud.tencent.com/developer/article/1147765 一.RocketMQ基础知识介绍 A ...
- activemq集群搭建Demo
activemq5.14.5单节点安装Demo 第一步:创建集群目录 [root@node001 ~]# mkdir -p /usr/local/activemqCluster 复制单点至集群目录 [ ...
- Spark Streaming性能优化系列-怎样获得和持续使用足够的集群计算资源?
一:数据峰值的巨大影响 1. 数据确实不稳定,比如晚上的时候訪问流量特别大 2. 在处理的时候比如GC的时候耽误时间会产生delay延迟 二:Backpressure:数据的反压机制 基本思想:依据上 ...
随机推荐
- 【iCore1S 双核心板_ARM】例程八:ADC实验——电源监控
实验原理: STM32内部集成三个12位ADC,iCore1S的所有电源经过 电阻分压或者直接接入STM32的ADC的输出通道内,输入电流 经过高端电流检测芯片ZXCT1009F输入到ADC的输入通道 ...
- 【iCore1S 双核心板_ARM】例程十一:RTC实时时钟实验——显示时间和日期
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ RTC_DateTypeDef sDate; RTC_TimeTypeDef sTime; u ...
- Jenkins这种构建工具,一般都是内部使用,所以外部基本上不能访问
类似于Jenkins这种构建工具,一般都是内部使用,所以外部基本上不能访问,也可以隔绝外部黑客的入侵等.直接暴露外部是非常不安全的,特别是没有什么安全验证,容易被别人入侵做一些非法的事情! 所以,希望 ...
- Vue.js常用指令:v-for
一.什么是v-for指令 在Vue.js中,我们可以使用v-for指令基于源数据重复渲染元素.也就是说可以使用v-for指令实现遍历功能,包括遍历数组.对象.数组对象等. 二.遍历数组 代码示例如下: ...
- NLog使用
NLog的配置文件,文件上面有详细的备注,注意这个配置文件一定要放在NLog.dll的文件夹里 <?xml version="1.0" encoding="utf- ...
- Go指南练习_斐波纳契闭包
源地址 https://tour.go-zh.org/moretypes/26 一.题目描述 让我们用函数做些好玩的事情. 实现一个 fibonacci 函数,它返回一个函数(闭包),该闭包返回一个斐 ...
- python初级 2 字符串格式化
一.回顾 上次我们讲解的数据类型,有int,float,str,bool,NoneType五种 前两种和后两种都比较简单,str较为复杂 二.字符串格式化的使用场景: 有一种字符串, xxx 的内容都 ...
- 图片相似原理--Java实现
前阵子在阮一峰的博客上看到了这篇<相似图片搜索原理>博客,就有一种冲动要将这些原理实现出来了. Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相 ...
- 使用UIScrollView 结合 UIImageView 实现图片循环滚动
场景: 在开发工作中,有时我们需要实现一组图片循环滚动的情况.当我们使用 UIScrollView 结合 UIImageView 来实现时,一般 UIImageView 会尽量考虑重用,下面例子是以( ...
- HTTP Status 500 - Could not open Hibernate Session for transaction;
错误原因: mysql数据库没有连接上 我们来启动mysql 方法1: 管理员身份运行 cmd 输入: net start mysql 方法2: Windows + R 运行 services.ms ...