欢迎来到天天文库
浏览记录
ID:19380447
大小:2.30 MB
页数:23页
时间:2018-10-01
《2009-02-21 hadoop源代码分析(mapreduce概论) 大家都熟悉文件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、2009-02-21Hadoop源代码分析(MapReduce概论)大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花很多的时间去介绍HDFS的背景,毕竟大家对文件系统的还是有一定的理解的,而且也有很好的文档。在分析Hadoop的MapReduce部分前,我们还是先了解系统是如何工作的,然后再进入我们的分析部分。下面的图来自http://horicky.blogspot.com/2008/11/hadoop-mapreduce-implementation.html,是我看到的讲MapReduce最好的图。 以H
2、adoop带的wordcount为例子(下面是启动行):hadoopjarhadoop-0.19.0-examples.jarwordcount/usr/input/usr/output用户提交一个任务以后,该任务由JobTracker协调,先执行Map阶段(图中M1,M2和M3),然后执行Reduce阶段(图中R1和R2)。Map阶段和Reduce阶段动作都受TaskTracker监控,并运行在独立于TaskTracker的Java虚拟机中。我们的输入和输出都是HDFS上的目录(如上图所示)。输入由InputForm
3、at接口描述,它的实现如ASCII文件,JDBC数据库等,分别处理对于的数据源,并提供了数据的一些特征。通过InputFormat实现,可以获取InputSplit接口的实现,这个实现用于对数据进行划分(图中的splite1到splite5,就是划分以后的结果),同时从InputFormat也可以获取RecordReader接口的实现,并从输入中生成对。有了,就可以开始做map操作了。map操作通过context.collect(最终通过OutputCollector.collect)将结果写到co
4、ntext中。当Mapper的输出被收集后,它们会被Partitioner类以指定的方式区分地写出到输出文件里。我们可以为Mapper提供Combiner,在Mapper输出它的时,键值对不会被马上写到输出里,他们会被收集在list里(一个key值一个list),当写入一定数量的键值对时,这部分缓冲会被Combiner中进行合并,然后再输出到Partitioner中(图中M1的黄颜色部分对应着Combiner和Partitioner)。Map的动作做完以后,进入Reduce阶段。这个阶段分3个步骤:混洗(Sh
5、uffle),排序(sort)和reduce。混洗阶段,Hadoop的MapReduce框架会根据Map结果中的key,将相关的结果传输到某一个Reducer上(多个Mapper产生的同一个key的中间结果分布在不同的机器上,这一步结束后,他们传输都到了处理这个key的Reducer的机器上)。这个步骤中的文件传输使用了HTTP协议。排序和混洗是一块进行的,这个阶段将来自不同Mapper具有相同key值的对合并到一起。Reduce阶段,上面通过Shuffle和sort后得到的6、fvalues)>会送到Reducer.reduce方法中处理,输出的结果通过OutputFormat,输出到DFS中。2009-02-25Hadoop源代码分析(包org.apache.hadoop.mapreduce)有了前一节的分析,我们来看一下具体的接口,它们都处于包org.apache.hadoop.mapreduce中。 上面的图中,类可以分为4种。右上角的是从Writeable继承的,和Counter(还有CounterGroup和Counters,也在这个包中,并没有出现在上面的图里)和ID相关的类,它7、们保持MapReduce过程中需要的一些计数器和标识;中间大部分是和Context相关的*Context类,它为Mapper和Reducer提供了相关的上下文;关于Map和Reduce,对应的类是Mapper,Reducer和描述他们的Job(在Hadoop中一次计算任务称之为一个job,下面的分析中,中文为“作业”,相应的task我们称为“任务”);图中其他类是配合Mapper和Reduce工作的一些辅助类。如果你熟悉HTTPServlet,那就能很轻松地理解Hadoop采用的结构,把整个Hadoop看作是容器,那么8、Mapper和Reduce就是容器里的组件,*Context保存了组件的一些配置信息,同时也是和容器通信的机制。和ID相关的类我们就不再讨论了。我们先看JobContext,它位于*Context继承树的最上方,为Job提供一些只读的信息,如Job的ID,名称等。下面的信息是MapReduce过程中一些较关键的定制信息:(来自ht
6、fvalues)>会送到Reducer.reduce方法中处理,输出的结果通过OutputFormat,输出到DFS中。2009-02-25Hadoop源代码分析(包org.apache.hadoop.mapreduce)有了前一节的分析,我们来看一下具体的接口,它们都处于包org.apache.hadoop.mapreduce中。 上面的图中,类可以分为4种。右上角的是从Writeable继承的,和Counter(还有CounterGroup和Counters,也在这个包中,并没有出现在上面的图里)和ID相关的类,它
7、们保持MapReduce过程中需要的一些计数器和标识;中间大部分是和Context相关的*Context类,它为Mapper和Reducer提供了相关的上下文;关于Map和Reduce,对应的类是Mapper,Reducer和描述他们的Job(在Hadoop中一次计算任务称之为一个job,下面的分析中,中文为“作业”,相应的task我们称为“任务”);图中其他类是配合Mapper和Reduce工作的一些辅助类。如果你熟悉HTTPServlet,那就能很轻松地理解Hadoop采用的结构,把整个Hadoop看作是容器,那么
8、Mapper和Reduce就是容器里的组件,*Context保存了组件的一些配置信息,同时也是和容器通信的机制。和ID相关的类我们就不再讨论了。我们先看JobContext,它位于*Context继承树的最上方,为Job提供一些只读的信息,如Job的ID,名称等。下面的信息是MapReduce过程中一些较关键的定制信息:(来自ht
此文档下载收益归作者所有