如果想要将问题变得清晰、精准和优雅, 需要关注 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. css3实现轮播图

    css3动画属性简写: animation: name  duration  timing-function  delay  iteration-count  direction  fill-mode ...

  2. vb常用的内部函数(二):字符串函数

    len(string):计算字符串长度函数.返回字符串string中字符的个数.一个汉字为一个字符,空格也为一个字符,空字符串的长度为0. Ltrim(string).Rtrim(string).Tr ...

  3. 拉格朗日插值&&快速插值

    拉格朗日插值 插值真惨 众所周知$k+1$个点可以确定一个$k$次多项式,那么插值就是通过点值还原多项式的过程. 设给出的$k+1$个点分别是$(x_0,y_0),(x_1,y_1),...,(x_k ...

  4. GDOI2017 再次酱油记

    Day 0 13:00 pm 啊...今天中午一点钟从ez出发,感觉吼有趣啊.出发前先大喊一声****,在书包里放一本党史,感觉玄学可以救命[滑稽] 15:00 pm 到达东莞,坐标:石龙名冠金凯悦大 ...

  5. du -sh*查看当前目录下的文件夹大小

    du -sh*查看当前目录下的文件夹大小   u 命令    用途    概述磁盘使用.    语法  du [ -a | -s ] [ -k ] [ -m ] [ -g ][ -l ] [ -r ] ...

  6. mac终端安装webpack的时候报错Err,解决的办法 sudo npm install webpack -g

    MacBook-Air:~ xxx$ npm install webpack -g npm WARN invalid config registry="" npm WARN inv ...

  7. react-native 编译报错: undefined is not an object (evaluating '_react2.PropTypes.func')

    情况通报: 因为是我的二维码模块报错,提示报错代码如下 重要信息是下面的红色字体部分(Android 模拟器红屏) undefined is not an object (evaluating '_r ...

  8. caioj 1155 同余方程组(模版)

    第一步,和同余方程一样,转化一下 两式相减得 这就转化为了求不定方程,用exgcd 求出x,要化成最小正整数解,避免溢出 然后可以求出P出来. 这个时候要把前两个式子转化成一个式子 设求出来的是P' ...

  9. 如何检查 Android 应用的内存使用情况

    Android是为移动设备而设计的,所以应该关注应用的内存使用情况.尽管Android的Dalvik虚拟机会定期执行垃圾回收操作,但这也不意味着就可以忽视应用在何时何处进行内存分配和释放.为了提供良好 ...

  10. Swift中实现Array数组和NSArray数组的相互转换与遍历

    Array是Swift中的数组数据类型.而NSArray是OC中的数组数据类型.两者有差别有联系.在Swift中有时候难免会使用到OC中的一些东西.今天我们就来Swift中使用NSArray和Arra ...