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前分组排序:自定义

  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12218411.html
Copyright © 2011-2022 走看看