zoukankan      html  css  js  c++  java
  • 二 MapReduce 各阶段流程分析


      如果想要将问题变得清晰、精准和优雅, 需要关注 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 键分割。不同记录通过换行符分割。 一般情况都是自定义输出格式。

















    God has given me a gift. Only one. I am the most complete fighter in the world. My whole life, I have trained. I must prove I am worthy of someting. rocky_24
  • 相关阅读:
    python函数内容
    python读写csv文件
    python正则表达式
    python使用MYSQL数据库
    python简单面试题
    python执行cmd命令
    python详解json模块
    我的自动化测试之路
    测试开发这一年
    招聘测试人员,我在面试什么?
  • 原文地址:https://www.cnblogs.com/rocky24/p/8c916260dd52294276a829ccdadf5696.html
Copyright © 2011-2022 走看看