一时兴起,写了下面的小程序,程序用来实现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的朴素贝叶斯分类如何在Hadoop平台上运行,以及它在实际问题中的应用和优势。"NaiveBayesClassify"这个文件可能包含了实现这种分类的源代码或者示例,可以作为进一步研究的...
MapReduce是一种分布式编程模型,由Google开发,用于处理和生成大数据集。在Hadoop框架下,MapReduce将大型任务拆分成一系列可并行处理的小任务,从而高效地运行在大规模集群上。本案例中,我们关注的是如何使用...
书中还可能涵盖了MapReduce编程模型,包括自定义Mapper和Reducer类,以及Combiner和Partitioner的使用。Combiner可以在本地节点上提前减少数据传输,提高效率;Partitioner则控制中间结果发送到哪个Reducer,通常...
MapReduce是一种处理大规模数据集的编程模型,它将复杂的数据处理任务分解为两个主要阶段:Map阶段和Reduce阶段。Map阶段负责对输入数据进行切分和转换,生成中间键值对;Reduce阶段则将相同的键值对聚合,进行必要...
泛型则是编程语言中的一种高级特性,它允许开发者定义可以适用于多种数据类型的类、接口或方法。在Java、C#等语言中,泛型显著提高了代码的复用性,避免了类型转换的繁琐和潜在的运行时错误。泛型容器,如ArrayList...
实验内容涵盖了从启动全分布模式的Hadoop集群到编写、运行和分析MapReduce应用程序的全过程。 首先,实验启动了Hadoop集群的所有守护进程,包括NameNode(主节点,负责元数据管理)、DataNode(存储数据的节点)、...
(2)打开网站localhost:8088和localhost:50070,查看MapReduce任务启动情况 (3)写wordcount代码并把代码生成jar包 (4)运行命令 (1):把linus下的文件放到hdfs上 (2):运行MapReduce (5):查看运行结果 ...
该代码还使用了Hadoop MapReduce框架中的各种类和接口,例如Configuration、Job、Mapper、Reducer、Context等,来实现MapReduce任务的配置、执行和监控。 该基于MapReduce的Apriori算法代码实现了关联规则挖掘的...
5. 基于MapReduce的决策树算法的应用:基于MapReduce实现决策树算法可以应用于数据挖掘、机器学习和推荐系统等领域,例如可以用于用户行为分析、推荐系统和风险评估等。 6. 决策树算法在MapReduce中的实现细节:在...
MapReduce是一种分布式计算模型,由Google在2004年提出,主要用于处理和生成大规模数据集。Hadoop是Apache开源项目,它实现了MapReduce模型,为大数据处理提供了可靠的分布式计算框架。在这个场景中,我们将讨论如何...
在大数据处理领域,Hadoop是不可或缺的一个开源框架,它提供了分布式存储(HDFS)和分布式计算(MapReduce)的能力。本教程将详细讲解如何使用Java编程语言操作Hadoop的MapReduce来计算整数序列中的最大值和最小值,...
2. **编程接口**:MapReduce提供了编程接口,包括Mapper类和Reducer类,用户需要继承这两个类并重写其方法。Mapper处理输入键值对,Reducer进行数据聚合。此外,还有Partitioner用于控制数据分发,Combiner用于本地...
本文将深入探讨MapReduce的测试类,这些类对于开发和调试MapReduce作业至关重要。 MapReduce测试类提供了模拟Hadoop环境的功能,允许开发者在本地运行测试,而无需依赖完整的分布式集群。这对于快速迭代和确保代码...
MapReduce是一种分布式计算模型,由Google开发,用于处理和生成大量数据。这个模型主要由两个主要阶段组成:Map(映射)和Reduce(规约)。MapReduce的核心思想是将复杂的大规模数据处理任务分解成一系列可并行执行...
在MapReduce中,计数器(Counter)是一个非常重要的工具,它允许开发者在MapReduce作业执行过程中收集和跟踪各种统计信息,帮助理解和优化程序的性能。计数器分为两类:Hadoop内置的计数器和自定义计数器。 内置...