hadoop源码分析-mapreduce部分_第1页
hadoop源码分析-mapreduce部分_第2页
hadoop源码分析-mapreduce部分_第3页
hadoop源码分析-mapreduce部分_第4页
hadoop源码分析-mapreduce部分_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2009-02-21分析Hadoop源代码(MapReduce简介)在您熟悉文件系统并分析HDFS之前,您没有花很多时间介绍HDFS的背景。因为他们不仅了解文件系统,而且拥有好的文档。在分析Hadoop的MapReduce部分之前,我们先了解系统的工作原理,然后继续分析部分。下图是http:/号利基。来自blogs /2008/11/Hadoop-MapReduce-implementation . html,这是MapReduce的最佳表现。以Hadoop乐队的wordcount为例(以下是运行行)。Hadoop jar Hadoop-0 . 19 . 0-examples .

2、 jar word count/usr/input/usr/output用户提交作业后,作业将由作业Tracker调整,首先运行Map阶段(图M1、M2和M3),然后运行Reduce阶段(图R1和R2)。Map阶段和Reduce阶段行为都由TaskTracker监视,并在独立于TaskTracker的Java虚拟机上执行。戴尔的输入和输出都是HDFS上的目录(如上图所示)。输入由InputFormat接口描述,该接口通过ASCII文件、JDBC数据库等实现为单独处理数据源,并提供数据的一些特征。使用InputFormat,您可以获取用于拆分数据的InputSplit接口的实现(图中的spite

3、 1到splite1 5,即拆分后的结果),您可以从InputFormat中获取RecordReader接口的实现,然后从输入中创建对。如果有,您可以开始使用map。Map作业包含context.collect(最终为OutputCollector .通过collect)将结果写入context。收集Mapper的输出后,它将按照Partitioner类指定的方式写入输出文件。可以为贴图器提供comber。映射程序输出时,关键值对不会立即写入输出,而是收集在关键值列表(list)中,在记录特定数量的关键值对时,相应的缓冲区将合并到Combiner中并输出到Partitioner中(图M1中的黄

4、色部分对应于Combiner和Partitioner)。Map完成后,进入Reduce阶段。此步骤分为三个阶段:“混合”(Shuffle)、“排序”(sort)和reduce。在混合清洗阶段,Hadoop的MapReduce框架根据Map结果中的关键点将相关结果发送到一个Reducer(多个Mapper生成的同一关键点的中间结果分布在不同的计算机上,在此阶段结束时,全部发送到处理此关键点的Reducer)。此阶段的文件传输使用HTTP协议。对齐和混合是通过合并不同Mapper中具有相同关键点值的对来完成的。上面通过Shuffle和sort获得的结果是Reducer .reduce方法处理和输出

5、的结果通过OutputFormat输出到DFS。2009-02-25分析Hadoop源代码(程序包org.apache.hadoop.mapreduce)如上一节所分析,我们将查看org.apache.hadoop.mapreduce包中包含的特定界面。在上图中,类可以分为四种。右上角继承自Writeable(保留MapReduce进程所需的某些计数器和id),并具有Counter (CounterGroup和Counters,未出现在此包中)和ID相关类。中间是与Context相关的*Context类,该类为Mapper和Reducer提供相关上下文。对于Map和Reduce,该类包括Map

6、per、Reducer和说明它们的Job(在Hadoop中,计算任务称为一个Job;在下面的分析中,中文中,该task称为“作业”);图中的其它类是一些与Mapper和Reduce一起工作的辅助类。如果您熟悉http servlet,则可以轻松理解Hadoop采用的结构,并将整个Hadoop视为容器。Mapper和Reduce是容器的组件。*Context是存储组件的某些配置信息的同时与容器通信的机制。我不再讨论与身份相关的类了。首先,我们将查看*Context继承树顶部的JobContext。向职务提供只读信息,如职务的标识和名称。以下是MapReduce流程的一些重要自定义信息:(在htt

7、p:/www . IBM.com/developer works/cn/open source/OS-cn-hadop 2/index . html上使用):参数作用默认值其他实现InputFormat将输入的数据集剪切到较小的数据集InputSplits时,每个InputSplit由Mapper处理。RecordReader实现也可用于InputFormat,它将InputSplit解析为映射函数中的一对。TextInputFormat对于文本文件,逐行将文本文件剪切到InputSplits,然后使用LineRecordReader配对InputSplit。其中key是文件中的行位置,val

8、ue是文件中的一行SequenceFileInputFormatOutputFormat提供RecordWriter的实现以输出最终结果TextOutputFormat(使用LineRecordWriter将最终结果写入平面文件文件,每个结果占一行,关键字和值之间用制表符分隔。)SequenceFileOutputFormatOutputKeyClass输出最终结果中的key类型LongWritableOutputValueClass输出最终结果中的value类型文本MapperClass完成对Mapper类、map函数的实现和输入的中间结果的映射IdentityMapper(将输入内容完整地

9、输出到中间结果)LongSumReducer、LogRegexMapper、InverseMapperComber类实现合并中间结果中重复键的combine函数空值中间结果中的重复关键点不会合并Reducer类Reducer类,实现reduce函数,合并中间结果,形成最终结果IdentityReducer(将中间结果直接输出为最终结果)Accumulating reducer,longgsumreducerInputPath设定工作的输入目录,工作执行时会处理输入目录下的所有档案空值OutputPath设置作业的输出目录后,作业的最终结果将写入输出目录下空值MapOutputKeyClass在

10、Map函数输出的中间结果中设置key的类型如果用户未设置,请使用OutputKeyClassMapOutputValueClass在Map函数输出的中间结果中设置value类型如果用户未设置,请使用OutputValuesClassOutputKeyComparator排序结果中的关键点时使用的比较器WritableComparablePartitionerClass对中间结果中的键进行排序后,使用此Partition函数将其分为r部分,每个部分由Reducer处理。散列partitioner(使用Hash函数作为partition)keyfieldbasedpartitioner pipes

11、 partitionerJob继承自JobContext,提供了一组设置作业的某些属性(Job更新属性、Job context读取属性)的set方法。职务还提供了多种控制作业的方法,例如:L mapProgress:map进度(0-1.0);L reduceProgress:reduce进度(0-1.0);L isComplete:操作是否完成;L isSuccessful:操作是否成功;L killJob:结束正在运行的作业。L getTaskCompletionEvents:接收任务完成的响应(成功/失败)。L killTask:结束操作。2009-02-25分析Hadoop源代码(包ma

12、preduce.lib.input)接下来,将org . Apache . Hadoop . MapReduce . lib . *的内容分解为MapReduce进程中数据的流动顺序,并介绍其基类的功能。第一个是实现MapReduce的数据输入部分的input部分。类图如下所示:类图的右上角是描述MapReduce Job输入的InputFormat。使用InputFormat,Hadoop可以:验证L MapReduce输入数据的准确性。l剪切输入数据Mapper划分为要分配给的逻辑块InputSplit。l提供RecordReader实现,Mapper使用该实现读取从InputSplit输

13、入的对。在org . Apache . Hadoop . MapReduce . lib . input中,Hadoop为所有基于文件的InputFormat提供虚拟基类FileInputFormat。以下参数可用于配置FileInputFormat:lm mapred . input . path filter . class:输入文件过滤器将InputFormat添加。L mapred.min.split.size:最小分割大小;Lmmapred.max.split.size:最大拆分大小;Lmmapred.input.dir:输入路径(以逗号分隔)。类中更重要的方法包括:Protecte

14、d list status(配置任务)递归导入输入数据目录中的所有文件(包括文件信息),输入的作业是包含上述参数的系统执行配置配置。Public list get spits(作业内容内容)将输入除以InputSplit包含两个循环,第一个循环处理所有文件,并根据为每个文件输入的拆分的最大/最小值循环处理文件中的拆分。分割不会与档案相交。FileInputFormat没有实现InputFormat的createRecordReader方法。FileInputFormat具有两个子类,SequenceFileInputFormat是以Hadoop定义的二进制格式存储的密钥/值文件,位于http:

15、/Hadoop . Apache . org/core/docs/current/SequenceFileInputFormat使用特殊扩展名重载listStatus,同时实现createRecordReader以返回SequenceFileRecordReader对象。TextInputFormat处理文本文件,createRecordReader返回LineRecordReader的实例。这两个类都不重载FileInputFormat的getSplits方法。对于RecordReader,需要考虑FileInputFormat如何拆分输入。返回FileInputFormat的getSplits、FileSplit。非常简单的类,包含文件名、开始偏移、拆分长度和可能的目标系统等属性。RecordReader用于从拆分中读取对。RecordReader有五种虚拟方法:Initialize:在Reader中操作的数据分区InputSplit和操作的上下文context初始化包含的输入参数。L nextKey:键入,然后获取密钥。如果数据拆分没有新记录,则返回空键。获取L nextValue: Key的相应Value。调用nextKey后,必须调用它。L getProgress:获取当前进度。l close,java.io的Closeable界面,用于清理RecordR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论