如果想要将问题变得清晰、精准和优雅, 需要关注 MapReduce 作业所需要的系统资源,尤其是集群内部网络资源使用情况。 MR 可以运行在共享集群上处理 TB 级 甚至 PB 级的数据。同时,改作业与共享集群的机器上数以百计的任务存在竞争关系。


MapReduce 关注点:

作业被分成一系列运行在分布式集群中的 map 任务和 reduce 任务。因此负载是遍布集群中的各个节点的。 map 任务主要负责数据的载入、解析、转换、和过滤。每个 reduce 任务负责处理 map 任务输出结果的一个子集 ,然后 reduce 任务从 mapper 任务处复制 map 任务的中间数据,进行分组和聚合操作。 从简单的聚合到复杂的关联以及笛卡尔积操作。



MapReduce 


mapreduce 任务提交的yarn mapreduce任务过程分为_键值对



文件分块Block,Split读块,到Map,到Reduce的过程



下面引用的这个图 特么有点问题。  画错了。


Partitioner 是根据 key 或 value 及 reduce 的数量来决定当前的这对输出数据交给那个 reduce task,默认是对 key 进行 hash 后 再以reduce 数量取模。是为了平均 reduce 的处理能力。Partitioner 的默认内存缓冲区是 100MB,当 mapTask输出更多结果的时候就会将数据刷入磁盘中形成临时文件,然后再次利用缓冲区进行写。 就是 Spill 过程。溢写是由单独线程来完成,不影响往缓冲区写 map 结果的线程。 溢写的阈值时 0.8 也就是 80MB 后开始启动 溢写, Spill 会将这80MB 内存锁定,执行溢写。 MapTask 还可以继续写入剩下的20MB 互不影响。 内存缓冲区不会对发送到相同的 reduce 端的数据做合并, 合并是体现在磁盘文件中的,官方图上讲的是 溢写文件 会对不同的 reduce 端做数据合并。 减少 partition 相关的记录。   溢写线程启动后会对 80MB 空间的 key 做排序(sort过程 默认)。Combiner 做累加、最大值、最小值等不影响输出结果的操作很适合。

Reduce (Shuffer  ) 1 拉取map结果,不断的做 merge, merge有三种形 式:1)内存到内存 2)内存到磁盘 3)磁盘到磁盘。 

                    2 不断 merge 后,产生一个最终文件。 可能内存,也可能磁盘中。 当Reduce 输入文件copy 完成。开始执行 Reduce 最后是结果放入 HDFS




应该是

             Map

                |

            Spill

                |

        Partitioner

                |

             sort

                |

        Combiner

                |

            shuffer

                |

          Reduce




mapreduce 任务提交的yarn mapreduce任务过程分为_临时文件_02


2、Map Task的整体流程:

可以概括为5个步骤:

         1)Read:Map Task通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。

         2)Map:该阶段主要将解析出的key/value交给用户编写的map()函数处理,并产生一系列的key/value。

         3)Collect:在用户编写的map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输入结果。在该函数内部,它会将生成的 key/value分片(通过Partitioner),并写入一个环形内存缓冲区中。

        4)Spill:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并,压缩等操作。

        5)Combine:当所有数据处理完成后,Map Task对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。

3、Reduce的整体流程:

可以概括为5个步骤:

        1)Shuffle:也称Copy阶段。Reduce Task从各个Map Task上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阀值,则写到磁盘上,否则直接放到内存中。

        2)Merge:在远程拷贝的同时,Reduce Task启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或者磁盘上文件过多。

        3)Sort:按照MapReduce语义,用户编写的reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一 起,Hadoop采用了基于排序的策略。由于各个Map Task已经实现了对自己的处理结果进行了局部排序,因此,Reduce Task只需对所有数据进行一次归并排序即可。

        4)Reduce:在该阶段中,Reduce Task将每组数据依次交给用户编写的reduce()函数处理。

        5)Write:reduce()函数将计算结果写到HDFS。


 





Hadoop 1.0 :

map 任务阶段:

record reader -> mapper -> combiner -> partitioner


reduce 任务阶段:

shuffer -> sort -> reduce -> output format


各个阶段理解:

    record reader 

     将输入的数据解析成记录。也就是将数据转换为 ( Key , Value ) 的形式,并传递给 mapper 处理。

map

     处理 record reader 解析键值对来产生

combiner

    可选的本地 reduce,可以在 map 阶段聚合数据。

        例: 发送一次 3M的数据块 比 发送 3 次 1M 的数据块要节省很多字节量。

     可以产生特别大的性能提升,并且还木有副作用。

partitioner

    计算目标的散列值(通常MD5)。 将吧 键值对 随机的讲整个空间平均分发给每个 reduce , 同时也能保证不同的 mapper 产生的相同键能被分发到同一个 reduce (同 HBase 的自动均衡 找 region 一个原理),用户可以定制,比如排序。一般不需要改写 partitioner 。 对于每个 map 任务,其分好的数据最终会写入本地文件系统,等待各自的 reduce 拉取。

 shuffer (混排 和 排序)

    将数据按键排序,在写入到一个较大的数据列表中。 目的是将相同键的记录聚合在一起。这个过程完全不可定制。 开发人员只能通过自定义 Comparator 对象来确定键如何排序和分组。

    reduce

        将已经分组的数据作为输入,并依次为每个键对应分组执行 reduce 函数。 

     output format 输出格式

        获取 mapReduce 函数输出的最终键值对。 并通过 record writer 写入到输出文件中。每条记录默认 tab 键分割。不同记录通过换行符分割。 一般情况都是自定义输出格式。