用一个10行代码的案例,一个没有map和reduce的类分解Mapreduce过程。
操作过程:
1>:创建MapReduce项目,并配置Run Configuration选项中的Argument输入输出路径.如图
2>:再看代码
public class MyWordCount{
/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
//根据安装的Hadoop夹下conf文件创建对象
Configuration conf = new Configuration();
//根据Run Configuration设置下的arguments 下的选项得到输入输出路径
String [] otherArgs=new GenericOptionsParser(conf, args).getRemainingArgs();
if(otherArgs.length!=2){
System.err.println("Usage:wordcount <in> <out>");
System.exit(2);
}
//定义一个job
Job job=new Job(conf, "My WordCount");
//制定输入输出路径
FileInputFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//等待job执行完毕退出
System.exit(job.waitForCompletion(true)?0:1);
}
}
3>执行结果
文件源如图:
执行结果如图:
结果分析:
1>事实
源文件有两个,用户没有自己定义任何Map和Reduce的情况下,执行后依旧可以得到MapReduce结果,当然前提是使用了插件创建的是MapReduce项目.并非是一个单纯的Java 项目.
2>过程解析
第一步:首先使文件会被分为特定大小的split,叫做分区每一个split会对应启动一个task.分别执行的是MapTask和ReduceTask.
第二步:每一个split首先会被hadoop框架分解成一个个的<key,Value>对,具体是<偏移量,文本行>(偏移量指的是每个文本行的首字母对文件的初始位置的偏移,文本行是以/r/n来判断的). 如此形式:
<0,zhong nan da xue>
<14,hu nan da xue>
<27,shi fan da xue>
第三步:交由用户自定义的Map处理.以系统的wordcount为例,执行程序中的命令得到的结果是: <zhong,1>,<nan,1><da,1>,<xue,1>,<hu,1>,<nan,1>.....
第四步:sort过程.即排序.
<zhong,list(1)>
<nan,list(1,1)>
<da,list(1,1,1)>....
显然是将文件中有相同的key的进行排序,以这种格式发送给Reduce,有助于解决带宽问题.
第五步:shuffle过程,翻译为洗牌过程.顾名思义,洗牌是将牌打乱再分配的过程.对应的是reduce任务取得map任务输出的文件.这个过程是hadoop框架自动实现的,默认是按照hash函数执行的(此处不做深入分析).此过程后就将文件传给了reduce了.
第六步:执行reduce.还是以wordcount为例.j将list中的数字相加得到:
<zhong,1>
<nan,2>
<da,3>....
分析本案例:
本案例中没有定义任何map和reduce,得到了上述的结果是因为没有执行用户自定义的map和reduce,所以是以第二步之后的结果形式展现的,这是默认的形式.
以上只是很概括的展现了map和reduce的过程,还有很多细节值得深入,未完待续.....
- 大小: 39.9 KB
- 大小: 73 KB
- 大小: 86.4 KB
分享到:
相关推荐
这是谷歌三大论文之一的 MapReduce: Simplified Data Processing on Large Clusters 英文原文。我的翻译可以见https://blog.csdn.net/m0_37809890/article/details/87830686
MapReduce: Simplified Data Processing on Large Clusters from google.
来自于GOOGLE的mapreduce的开山之作,此文是原英文的中文版本,希望能互相参照,加深理解
计算利用一个输入key/value对集,来产生一个输出key/value对集.MapReduce库的用户用两个函数表达这个计算:map和reduce. 用户自定义的map函数,接受一个输入对,然后产生一个中间key/value对集.MapReduce库把所有具有...
Google并行计算,分布式处理模型MapReduce: Simplified Data Processing on Large Clusters
MapReduce: Simplified Data Processing on Large Clusters翻译
mapreduce创建代码项目mvn原型:generate -DarchetypeGroupId = org.apache.maven.archetypes -DgroupId = org.conan.mymahout -DartifactId = myPro -DpackageName = org.conan.mymahout -Dversion = 1.0-SNAPSHOT ...
MapReduce:Nkeys,Nfiles终极解决方案.docx
Google的MapReduce并行计算原始论文详解。
MapReduce的翻译,我只是个搬运工qwq
map-reduce Node的map-reduce算法 安装 $ npm install node-mapreduce 用法 var MapReduce = require ( 'node-mapreduce' ) ; var mapReduce = MapReduce ( ) ; var article = 'A very long string' ; function ...
一篇文章是Google的Jeffrey Dean、Sanjay Ghemawat发表的标题为《MapReduce:一个灵活的数据库处理工具》,另一篇文章是Michael Stonebraker、Daniel Abadi、David J. DeWitt、Sam Madden、Erik Paulson、Andrew ...
Google那篇著名的论文的ppt,MapReduce开山之作,介绍了Google对MapReduce的实现。
在 Haskell 中实现 Map reduce,试图利用并行性 编译: ghc -O2 -threaded -rtsopts mais.hs 跑步: ./main +RTS -Nx 其中 x 是您要运行的内核数量。 如果您想查看公开的并行性,可以使用 ThreadScope ( ),...
本项目为一个Hadoop课程设计,使用Java语言和map/reduce实现贝叶斯文本分类器。项目的具体内容如下:1:用MapReduce算法实现贝叶斯分类器的训练过程,并输出训练模型; 2:用输出的模型对测试集文档进行分类测试。...
NULL 博文链接:https://langyu.iteye.com/blog/962529
akka-mapreduce是一个基于Scala和Akka的库,可使用Scala中的Akka actor运行所有“ map”和“ reduce”任务并行运行的map-reduce作业。 在我们的框架中,最初使用Akka Stream读取数据,我们要做的是提供一个 ,可...
MapReduce原始论文
ReduceMap Java中的MapReduce 介绍 Java中的MapReduce,具有基本的master和worker实现。 项目结构 RPC框架 使用作为RPC框架。 protobuf3文件: master.proto:定义主RPC方法,由工作人员调用。 worker.proto:...
Map-Reduce原理体系架构和工作机制,eclipse与Hadoop集群连接