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


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


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




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 解析键值对来产生 0 或多个新的 键值对 结果。
    combiner
        可选的本地 reduce,可以在 map 阶段聚合数据。
        例: 发送一次 3M的数据块 比 发送 3 次 1M 的数据块要节省很多字节量。
        通常 combiner 可以产生特别大的性能提升,并且还木有副作用。
    partitioner
        将 mapper / combiner 输出的 键值对 拆分为分片,每个 reduce 对应一个分片。默认计算目标的散列值(通常MD5)。 将吧 键值对 随机的讲整个空间平均分发给每个 reduce , 同时也能保证不同的 mapper 产生的相同键能被分发到同一个 reduce (同 HBase 的自动均衡 找 region 一个原理),用户可以定制,比如排序。一般不需要改写 partitioner 。 对于每个 map 任务,其分好的数据最终会写入本地文件系统,等待各自的 reduce 拉取。
     shuffer (混排 和 排序)
        将所有的 partitioner 写入的输出文件拉取到运行 reducer 的本地机器上,然后将数据按键排序,在写入到一个较大的数据列表中。 目的是将相同键的记录聚合在一起。这个过程完全不可定制。 开发人员只能通过自定义 Comparator 对象来确定键如何排序和分组。
     reduce
        将已经分组的数据作为输入,并依次为每个键对应分组执行 reduce 函数。 
     output format 输出格式
        获取 mapReduce 函数输出的最终键值对。 并通过 record writer 写入到输出文件中。每条记录默认 tab 键分割。不同记录通过换行符分割。 一般情况都是自定义输出格式。













二 MapReduce 各阶段流程分析的更多相关文章

  1. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  2. kafka学习(二)kafka工作流程分析

    一.发送数据 follower的同步流程 PS:Producer在写入数据的时候永远的找leader,不会直接将数据写入follower PS:消息写入leader后,follower是主动的去lea ...

  3. Uboot启动流程分析(转载)

    最近一段时间一直在做uboot移植相关的工作,需要将uboot-2016-7移植到单位设计的ARMv7的处理器上.正好元旦放假三天闲来无事,有段完整的时间来整理下最近的工作成果.之前在学习uboot时 ...

  4. Android7.0 Phone应用源码分析(一) phone拨号流程分析

    1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...

  5. Android7.0 Phone应用源码分析(三) phone拒接流程分析

    本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...

  6. 报时机器人的rasa shell执行流程分析

      本文以报时机器人为载体,介绍了报时机器人的对话能力范围.配置文件功能和训练和运行命令,重点介绍了rasa shell命令启动后的程序执行过程. 一.报时机器人项目结构 1.对话能力范围 (1)能够 ...

  7. Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(二)

    本文继<Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)>,接着讲述MapReduce作业在MRAppMaster上处理总流程,继上篇讲到作业初始化之后的作 ...

  8. MSM8909中LK阶段LCM屏适配与显示流程分析(二)

    1.前言 在前面的文章MSM8909中LK阶段LCM屏适配与显示流程分析(一),链接如下: https://www.cnblogs.com/Cqlismy/p/12019317.html 介绍了如何使 ...

  9. MapReduce运行流程分析

    研究MapReduce已经有一段时间了.起初是从分析WordCount程序开始,后来开始阅读Hadoop源码,自认为已经看清MapReduce的运行流程.现在把自己的理解贴出来,与大家分享,欢迎纠错. ...

随机推荐

  1. n阶方阵,数字从1~n^2,顺时针增大

    运行结果如下图: 解题思路:可以将这个问题分解成x个外围正方形所围成的图形,外围的正方形又可以分为4个步骤,向右依次增大.向下依次增大.向左依次增大.向上依次增大.基本思路就是如此,最关键的就是什么时 ...

  2. shell编程, 100文钱买100只鸡, 简单实现

    今天碰到一个有趣的问题: 群友用shell写的一个: #!/bin/bash # 百元买百鸡,每种鸡至少买一只 all= # 公鸡每只多少元 read -p '公鸡多少文一只: ' gongji # ...

  3. 洛谷P3254 圆桌问题 网络流_二分图

    Code: #include<cstdio> #include<algorithm> #include<vector> #include<queue> ...

  4. 51nod 麦克打电话(AC自动机+树状数组)

    SAM+线段树合并的裸题. 但我们讨论AC自动机的做法. 先建出AC自动机.考虑询问在[a,b]中出现的次数就是\([1,b]\)的出现次数-\([1,a-1]\)的出现次数.把询问离线.然后我们要求 ...

  5. React 中组件间通信的几种方式

    在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 非嵌套组件间通信 跨级组件之间通信 1.父组件向子组件通 ...

  6. python购物车系统

    购物车系统模拟:product_list = [ ('java',100), ('python',200), ('键盘',500), ('电脑',4000), ('mac Book',7000),]S ...

  7. Mysql学习总结(29)——MySQL中CHAR和VARCHAR

    MySQL数据库的字符(串)类不要以为字符类型就是CHAR,CHAR和VARCHAR的区别在于CHAR是固定长度,只要你定义一个字段是CHAR(10),那么不论你存储的数据是否达到了10个字节,它都要 ...

  8. 完毕乔布斯的梦想:一个免费wifi共享的乌托邦

    早在2007年推出iPhone时,乔布斯就提出这种如果:商业区与居民区的wifi路由器全民开放,实现与路人共享网络之便.能够想象,那算是一个wifi共享的乌托邦. 数年过去了,乔布斯的梦想依然没能全然 ...

  9. GNU-libiconv编码转换库的使用举例

    继GDAL库.PROJ库.HDF5库.TINYXML库之后,手上进行的项目又让我碰到了ICONV库.之前花了2天时间没有搞定,在甲方一直催促下,今天又捡起来搞搞,搞了一天最终搞定了.相关心得记录例如以 ...

  10. RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能

    RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢? 官方提供了ItemTouchHelper类使用过程例如以下: 定义ItemTouchH ...