一时兴起,写了下面的小程序,程序用来实现MapReduce计算。并在客户端模拟一个可以用MapReduce的场景:有n个数字,1,2,3,... k ...,n-1,n。计算n个数字的平方和。程序提供了MapReduce方法和直接计算的方法分别计算结果,并比较每种计算方法的代价。程序会打印出所有计算的成本和最终计算结果。
事实上客户端完全可以定义自己的Dispense,Map和Reduce算法,如计算n个数字的立方和或统计日志。
程序中用到了以下的知识点:MapReduce,泛型,匿名内部类,多线程Runnable和Callable。
小子不才,计划以此程序为起点,做一个开源的MapReduce框架。希望朋友们和我一起讨论:程序中有哪些需要改进的地方?哪里有更好的实现方式。下面提供了程序的静态类图,时序图,api文档和源代码,和朋友们一起共勉。
mapreduce_paticipants
mapreduce_sequence
程序的原理如下:
见百度百科上对MapReduce的介绍MapReduce。
Dispense(分发)操作负责把大规模的原始列表(原始键值对)切割成小的碎片,并分发给每个计算节点。并行计算节点可以是线程、进程或服务器。Dispense所处的位置可能是主线程或中央节点服务器。
Map(映射)操作是把一个原始列表(原始键值对组)中的每一个元素进行指定的映射操作并返回一个新的列表(新键值对组)。这里的每个元素都是被独立操作的,所以适合高度的并行。
本程序的客户端:
原始列表:1,2,... k ...,n-1,n。 映射操作: k -> k*k。 新的列表:1*1,2*2,k*k,(n-1)*(n-1),n*n。
原始键值对组:1->1,2->2,... k->k...,n-1->n-1,n->n。 映射操作: k -> k*k。 新的键值对:1->1*1,3->3*3,k->k*k,(n-1)->(n-1)*(n-1),n->n*n。
Reduce(化简)操作指的是对新的列表(新的键值组)的元素进行适当的合并。 本例中适当的合并就是对新列表中的每个元素(新键值对组中的每个值)进行求和的合 并。
从MapReduce定义中可以看出:Map(映射)操作适合那些可高度并行化的操作,Reduce(化简)操作是对并行化操作后的结果进行合并的操作。通常化简操作的并行能力较差,但不是不可以,中央节点会进行最后的化简。
代码实现:
1、map算法
定义map接口
public interface IMaper<E> {
public E map(E x);
}
客户端实现map接口
new IMaper<Integer>() {
public Integer map(Integer x) {
// 模拟Map计算的成本
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
return x * x * x;
}
}
2、reduce算法
定义reduce接口
public interface IReducer<E> {
public E reduce(E x, E y);
}
实现reduce接口
new IReducer<Integer>() {
public Integer reduce(Integer x, Integer y) {
// 模拟Reduce计算的成本
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
if (x == null)
x = 0;
if (y == null)
y = 0;
return x + y;
}
}
3、模拟计算节点
public class CallNode<E> implements Callable<E> {
......public E call() throws Exception {
E sum = null;
if (maper == null)
throw new Exception("请给本计算节点" + this.toString() + "分配一个映射器对象");
if (reducer == null)
throw new Exception("请给本计算节点" + this.toString() + "分配一个化简器对象");
for (E e : subLists) {
sum = reducer.reduce(sum, maper.map(e));
}
return sum;
} ......
}
详细的代码实现请下载原代码。
- 大小: 5.3 KB
- 大小: 13.7 KB
分享到:
相关推荐
MapReduce实现单词分类,可直接运行。MapReduce实现单词分类,可直接运行。
基于Mapreduce的朴素贝叶斯分类
MapReduce天气源数据和计算类 1901年和1902的天气数据源,通过mr计算,找出最大温度和最小问题
mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce ...
实验,较之目前流行的传统贝叶斯算法、K最近邻(NN算法和支持向量机SVM)算法,基于MapReduce的贝叶斯垃圾邮件过滤机制在召回率、查准率和精确率方面保持了较好的表现,同时降低了邮件学习和分类成本,提高了系统执行...
基于MapReduce的分布式音频分类技术研究,张凤羽,刘亮,音频信息在人们生活中占据着十分重要的地位,从大量的音频文件中提取出关注的音频片段在多媒体检索和智能监控等领域都有着广泛的
本书对Hadoop Mapreduce进行详细讲解,切合实际应用,能够更深入地学习MapReduce,确实是一本不错的书。
(2)打开网站localhost:8088和localhost:50070,查看MapReduce任务启动情况 (3)写wordcount代码并把代码生成jar包 (4)运行命令 (1):把linus下的文件放到hdfs上 (2):运行MapReduce (5):查看运行结果 ...
SecondaryNameNode、ResourceManager、NodeManager 和 JobHistoryServer。 2. 在 Hadoop 集群主节点上搭建 MapReduce 开发环境 Eclipse。 3. 查看 Hadoop 自带的 MR-App 单词计数源代码 WordCount.java,在 Eclipse ...
Hadoop介绍,HDFS和MapReduce工作原理
mapreduce在hadoop实现词统计和列式统计,mrwordcount工程是统计hadoop文件中的词数,mrflowcount工程是统hadoop文件中的列表
书中主要介绍编程模式,即如何利用MapReduce框架解决一类问题,重在提供解决问题的方法和思路。作者花大量篇幅介绍各种模式的原理及实现机制,并给出相应的应用实例,让读者对每种模式能有更直观的理解。, 由于本书...
22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件 网址:https://blog.csdn.net/chenwewi520feng/article/details/130456088 本文的前提是hadoop环境正常。 本文最好和MapReduce操作常见...
Mapreduce实验报告 前言和简介 MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计 算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分 ,分别解决然后...
对于两个输入文件,即文件 A 和文件 B,请编写 MapReduce 程序,对两个文件进行合并, 并剔除其中重复的内容,得到一个新的输出文件 C。下面是输入文件和输出文件的一个样例 供参考。 输入文件 A 的样例如下:
【MapReduce篇07】MapReduce之数据清洗ETL1
MapReduce发明人关于MapReduce的介绍
java操作hadoop之mapreduce计算整数的最大值和最小值实战源码,附带全部所需jar包,欢迎下载一起学习。