zoukankan      html  css  js  c++  java
  • MapReduce--Shuffle原理

    一、MR的shuffle流程。

     1、什么是shuffle:mapreduce 主要分为map阶段和reduce阶段,map阶段主要是将从源加载过来的数据,转换为key value键值对。reduce阶段就是并行处理具有相同key的键值对,将其进行聚合处理,输出新的键值对作为结果。而为了保证reduce可以并行的处理map的结果,必须对map的输出结果进行一定的排序和分区,然后再传输至reduce上,这个过程就是shuffle。

    2、shuffle过程:shuffle过程主要包括两个阶段,map shuffle和reduce shuffle。

    (1)map shuffle:主要包括:分区、排序、分割、合并这些流程。首先,每个节点的map任务内部维护一个环形内存缓冲区,用来存储map任务的输出,默认100M。map任务产生的数据会先写进缓冲区当中,当数据达到缓冲区的阈值时,会将缓冲区中的数据溢出至本地磁盘,作为spill溢出文件。而在缓冲区溢出数据之前,会根据reduce的任务数量将缓冲区数据进行分区,并且在每个分区中是按照key进行排序的(快排)

      默认是使用HashPartitioner来分区,也可以自定义分区器进行分区。

      若有combiner函数,这个函数则会在每个map分区排序后的输出结果上运行,用于将每次溢写出来的文件进行分区合并和归并排序。从而使map输出结果更加紧凑。combinner函数是不同批次溢写出来的结果进行分区合并和分区内归并排序。(上方图)

      https://blog.csdn.net/qq_35688140/article/details/84111972

      ---------map方法之后,数据进入分区方法,将数据标记好分区。数据先写进缓冲区,达到阈值后,进行溢写,溢写前在缓冲区中先按照key进行分区,并且每个分区内会按照key进行快排。溢写后产生大量溢写文件,若有combiner函数,则会对不同批次的溢写文件进行归并排序。最后将文件按照分区存储到磁盘。等待reduce端拉取。

    注:

    (2)reduce shuffle:主要包括:复制和合并两个阶段。reduce开启复制线程从map中复制数据,其中reduce可能会从多个map中复制数据,复制自己处理的分区数据,因此一旦有一个map任务完成,就开始进行复制。数据小就保存在内存,数据量大就溢出到磁盘,最后进行归并排序合并这些文件。

           ---------每个reduce去map中拉取对应分区的数据,每个map任务都会有数据,数据先存进缓存,缓存达到阈值了再存到磁盘,拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入 Reduce 方法前,可以对数据进行分组操作

    二、MapReduce过程中可能发生多少次排序:

    总共可能发生 4 次排序过程:


    1)Map 阶段:
    环形缓冲区:对 key按照字典排序。排序手段:快速排序(能够手写快排)
    溢写到磁盘中:对多个溢写的文件进行排序。排序手段:分区归并排序(能够手写归并)


    2)Reduce 阶段:
    按指定分区读取到 reduce缓存中(不够落盘):归并排序
    Reduce task前分组排序:自定义

  • 相关阅读:
    我的暑假周记2018.7.21
    大道至简读后感
    我的暑假周记2018.7.15
    继承与多态
    java联级调用
    古罗马凯撒大帝字串加密
    作业三
    线性同余法产生1000个随机数
    Text2
    java登录界面
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12218411.html
Copyright © 2011-2022 走看看