hadoop的mapreduce的一些关键点整理

标签: hadoop mapreduce | 发表时间:2014-01-14 23:14 | 作者:jimmee
出处:http://www.iteye.com

  1. hadoop mapreduce 的流程图如下:

 



 

(1)用户提交一个任务以后,该任务由JobTracker协调,先执行Map阶段(图中M1,M2和M3),然后执行Reduce阶段(图中R1和R2)。Map阶段和Reduce阶段动作都受TaskTracker监控,并运行在独立于TaskTracker的Java虚拟机中。

 

(2)输入和输出都是HDFS上的目录(如上图所示)。输入由InputFormat接口描述,它的实现如ASCII文件,JDBC数据库等,分别处理对于的数据源,并提供了数据的一些特征。通过InputFormat实现,可以获取InputSplit接口的实现,这个实现用于对数据进行划分(图中的split1到split5,就是划分以后的结果),同时从InputFormat也可以获取RecordReader接口的实现,并从输入中生成<k,v>对。有了<k,v>,就可以开始做map操作了。

 

(3)map操作通过context.collect(最终通过OutputCollector. collect)将结果写到context中。当Mapper的输出被收集后,它们会被Partitioner类以指定的方式区分地写出到输出文件里。我们可以为Mapper提供Combiner,在Mapper输出它的<k,v>时,键值对不会被马上写到输出里,他们会被收集在list里(一个key值一个list),当写入一定数量的键值对时,这部分缓冲会被Combiner中进行合并,然后再输出到Partitioner中(图中M1的黄颜色部分对应着Combiner和Partitioner)。

 

(4) Map的动作做完以后,进入Reduce阶段。这个阶段分3个步骤:copy(复制数据)、排序(sort)和reduce。copy就是reduce节点从执行各个Map任务的服务器那里,拷贝的属于自己的数据;sort将从各个map节点那里copy到的数据进行排序;reduce是对排序的结果进行操作输出。

 

2. map 端操作的关键点

 

map端的数据结构如下图:



 

 

Hadoop的机制是通过一个circle buffer 收集Mapper的输出, 到了 io.sort.mb * io.sort.spill.percent或者key-value的数目超限(通过 io.sort.record.percent可以计算出记录的最大数目 的时候,就spill到disk,如下图。图中出现了两个数组和一个缓冲区,kvindices保持了记录所属的(Reduce)分区、key在缓冲区开始的位置和value在缓冲区开始的位置;通过kvindices,可以在缓冲区中找到对应的key-value记录。kvoffets用于在缓冲区满的时候对kvindices的partition进行排序,排完序的结果将输出到输出到本地磁盘上, 其中索引(每个 reduce 的数据的 index )保存在 spill{spill }.out.index 中,数据保存在 spill{spill }.out 中。

 

当Mapper任务结束后,有可能会出现多个spill文件,这些文件会做一个归并排序,形成Mapper的一个输出(spill.out和spill.out.index)。

 

map 小结: map 的输出结果包括两部分,一部分是将要传输到每个 reduce 节点的数据的索引文件(spill.out.index); 另一个部分是将要传输到 reduce 节点的 key-value 的值。其中,将输出到每个 reduce 节点的数据已根据 key 进行了排序。简言之, map 的输出结果先根据 reduce 的节点进行排序,再根据 key 进行排序。

 

 

 

3. reduce 端操作的关键点

 

下图来自《hadoop the definitive guide》。说明了reduce的三个主要阶段:copy、sort和reduce。



 

 

(1)copy阶段:reduce端启动copy的线程,当有map任务完成的时候,即从map服务器节点copy本reduce节点对应的数据;由于reduce节点的数据可能来自多个map节点,既然每个map节点的输出已经根据key排好序了,因此进行merge操作即可实现全局的有序,在copy的同时,同时会针对copy过来的数据进行merge排序操作

 

(2)sort阶段:虽然copy阶段已经进行了针对copy的数据进行了部分合并,在所有的文件都拷贝完毕后,还需要使用工具类Merger归并所有的文件。经过这一个流程,一个合并了所有所需Map任务输出文件的新文件产生了。

 

(3)reduce阶段:对sort的结果进行处理输出。

 

4. 一个关于 shuffle 的误解

 

其实shuffle并不是什么复杂的东西,shuffle描述的是从map端处理完数据后,reduce端从map端获取数据进行处理的过程,只需要明白map端和reduce分别都怎么处理的,就明白了mapreduce的原理。因此,shuffle可以理解为一个描述性的词语,想想一个map的结果会输出到不同的reduce节点;而一个ruduce节点的数据是来自多个map,这样一个mxn的形式,用线连起来,是不是像洗牌操作?

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hadoop mapreduce] 推荐:

Hadoop MapReduce技巧

- - 简单文本
我在使用Hadoop编写MapReduce程序时,遇到了一些问题,通过在Google上查询资料,并结合自己对Hadoop的理解,逐一解决了这些问题. Hadoop对MapReduce中Key与Value的类型是有要求的,简单说来,这些类型必须支持Hadoop的序列化. 为了提高序列化的性能,Hadoop还为Java中常见的基本类型提供了相应地支持序列化的类型,如IntWritable,LongWritable,并为String类型提供了Text类型.

下一代Hadoop MapReduce

- Jia - NoSQLFan
本文来自Hadoop Summit大会的一个演讲稿,主讲是Hadoop核心开发团队的Arun C Murthy (@acmurthy),同时他也是Yahoo!刚刚剥离的Hadoop独立公司Hortonworks的 Founder和架构师. 演讲中他讲述了现在的Hadoop存在的一些问题和集群上限,并展望了下一代Hadoop和其MapReduce将会得到的巨大提升.

"Hadoop/MapReduce/HBase"分享总结

- - ITeye博客
此分享是关于hadoop生态系统的简单介绍包括起源到相对应用. Hadoop和HBase.pdf (2.1 MB). 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

Hadoop之MapReduce单元测试

- - ITeye博客
通常情况下,我们需要用小数据集来单元测试我们写好的map函数和reduce函数. 而一般我们可以使用Mockito框架来模拟OutputCollector对象(Hadoop版本号小于0.20.0)和Context对象(大于等于0.20.0). 下面是一个简单的WordCount例子:(使用的是新API).

Hadoop MapReduce高级编程

- - 互联网 - ITeye博客
•combine函数把一个map函数产生的对(多个key, value)合并成一个新的. 将新的作为输入到reduce函数中,其格式与reduce函数相同. •这样可以有效的较少中间结果,减少网络传输负荷. •什么情况下可以使用Combiner.

[转]基于mapreduce的Hadoop join实现

- -
对于一个大数据的分析应用,join是必不可少的一项功能.现在很多构建与hadoop之上的应用,如Hive,PIG等在其内部实现了join程序,可以通过很简单的sql语句或者数据操控脚本完成相应的Join工作.那么join应该如何实现呢?今天我们就对join做一个简单的实现. 我们来看一个例子,现在有两组数据:一组为单位人员信息,如下:.

【Hadoop】MapReduce使用combiner优化性能

- - CSDN博客云计算推荐文章
当MapReduce模型中,reduce执行的任务为统计分类类型的值总量或去重后的数量,或最大值最小值时,可以考虑在Map输出后进行combine操作;这样可以减少网络传输带来的开销,同时减轻了reduce任务的负担. Combine操作是运行在每个节点上的,只会影响本地Map的输出结果;Combine的输入为本地map的输出结果(一般是数据在溢出到磁盘之前,可以减少IO开销),其输出则作为reduce的输入.

hadoop的IO和MapReduce优化参数

- - CSDN博客系统运维推荐文章
           在MapReduce执行过程中,特别是Shuffle阶段,尽量使用内存缓冲区存储数据,减少磁盘溢写次数;同时在作业执行过程中增加并行度,都能够显著提高系统性能,这也是配置优化的一个重要依据.            下面分别介绍I/O属性和MapReduce属性这两个类的部分属性,并指明其优化方向.

Hadoop MapReduce编程入门案例

- - CSDN博客云计算推荐文章
Hadoop入门例程简析中. (下面的程序下载地址: http://download.csdn.net/detail/zpcandzhj/7810829). (1)Hadoop新旧API的区别. 新的API倾向于使用虚类(抽象类),而不是接口,因为这更容易扩展. 例如,可以无需修改类的实现而在虚类中添加一个方法(即用默认的实现).

提高hadoop的mapreduce job效率

- - 数据库 - ITeye博客
hadoop 的mapreduce 的作业在运行过程中常常碰到一些这样的情 况:. 每一个map或者reduce只有30-40秒钟就结束. 超 大规模的job 时,通常会需要大量的map和reduce的slots 支持,但是job运行起来后,running的map和reduce并没有沾满集群的可用slots.