hadoop--MapReduce

1 MapReduce整体概述

MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题。它分为两个阶段Map和Reduce。Map将问题进行拆分,并逐行的解析内容,将解析好的内容传给reduce进行业务操作。
map:读取一行的文件内容,将内容进行解析,处理为键值对传给reduce。
reduce:对map传入的键值对按照任务需求进行处理,形成新的键值对传出。

2 MapReduce的核心概念

整个工作原理图:
这里写图片描述

2.1 Map

Map的处理步骤:

  • 1读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
  • 2 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
  • 3 对输出的key、value进行分区。
  • 4 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
  • 5 (可选)分组后的数据进行归约。

举例:WordCount计算每个单词出现的次数

这里写图片描述

例子解释
对每个单词的数量进行统计,Map阶段逐行读取数据,形成键值对(k1,v1)(对应整体流程图,这是Map的输入)。其中k1是以行字符串的偏移量来计算的,然后对键值对(k1,v2)进行解析,伪代码如图所示,形成新的键值对(k2,v2)输出,并作为Reduce的输入。

2.2 Reduce

Reduce的处理步骤:

  • 1 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
  • 2 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
  • 3 把reduce的输出保存到文件中。

举例:WordCount计算每个单词出现的次数

这里写图片描述

例子解释
Map处理完后变成(k2,v2)的键值对,输入给reduce,reduce根据业务进行计算,形成新的键值对(k3,v3),然后将结果保存到文件中

2.3 Shuffle

Hadoop生态系统中,Shuffle是MapReduce的核心机制,它肩负了从Map到Reduce的底层过程。主要有三个过程,分区,排序,本地结合。之所以说是核心机制,大部分的优化都是优化此过程。
整体的结构图:
这里写图片描述

整体过程:

  • 1)一个切片input split对应一个mapper,mapper将数据写入到环形缓冲区;
  • 2)这个环形缓冲区默认是100M,当它达到默认阀值80%的时候,它会将数据溢写(spill)到磁盘,在写磁盘过程中,map继续输出被写到缓冲区,如果在此期间缓冲区被填满,map会阻塞直到缓冲区被填满;
  • 3)溢写到磁盘的时候它并不是简单地将数据溢写,而是先进行分区(Partitioner有自定义就用自定义的,没有就用HashPartitioner),再在每个分区里对数据进行合并(Combiner);
  • 4)最后它会将数据合并成一个大文件,并且是相同分区号的数据进行合并;
  • 5)合并之后每个分区里面的数据再按照Key2进行合并,计算完成之后向上级提交,Hadoop1.0是TaskTracker,Hadoop2.0是MrAppMaster;
  • 6)Reducer通过心跳线程不停地到上级去取任务,1.0是越级到JobTracker来取,2.0是到MrAppMaster来取,Reducer得到映射关系之后通过http下载数据,下载很多小文件,再进行合并,作为输入,计算之后输出到HDFS。

2.3.1 Partitioner

Partitioner 组件可以让 Map 对 Key 进行分区,从而将不同分区的 Key 交由不同的 Reduce 处理。它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制。

2.3.2 Combiners

  • 相当于一个本地的reduce,在本地先进行合并,提高效率。只适用于输入与输出的类型相一致的情况,如累加、排序、求最大值。
  • 也可以作为一个自定义的部件,例如在本地先对信息进行一次过滤,将无效的信息去除,再传给reduce也是combiner可以实现的功能。

2.4 MapReduce作业中Map Task数目的确定

1)MapReduce从HDFS中分割读取Split文件,通过Inputformat交给Mapper来处理。Split 是 MapReduce 中最小的计算单元,一个 Split 文件对应一个Map Task。

2)默认情况下HDFS中的一个block,对应一个 Split。

3)用户可自行指定block与Split之间的关系,HDFS中的一个Split对应一个block,一个Split也可以对应多个block,Split与block是一对多的关系。

4)计算方式:

Math.max(minSize, Math.min(maxSize, blockSize);

若要调小 maxSize调小,默认是2^63-1,若要调大,调大minSize,默认是1。

5)总结MapReduce作业中的Map Task数目是由:
->(1)输入文件的大小与个数
->(2)hadoop设置split与block的关系

2.5 MapReduce作业中Reduce Task数目的确定

Reduce Task数目是由mapred.reduce.tasks,如果不指定默认为1。

猜你喜欢

转载自blog.csdn.net/xiayto/article/details/79852271