• mapreduce的流程


    mapreduce的流程

    在这里插入图片描述

    MR流程:输入分片 —> map阶段 —> combiner阶段(可选) —> shuffle阶段 —> reduce阶段

    1. 输入分片(input split):

    把输入文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的。默认情况下,输入片(InputSplit)的大小与数据块(Block)的大小是相同的。

    2. map阶段:

    输入片中的记录按照一定的规则解析成键值对,调用Mapper类中的map方法 比如wordcount 解析成以字符为key value 为1的map

    3. combiner阶段:

    Combiner是一个本地化的reduce操作,它是map运算的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作

    4. shuffle阶段:

    从功能看,进行合并把分散的数据排序,局部聚合,合并成一个大的数据 =>

    4.1.map端的shuffle

    分区

    在将map()函数处理后得到的(key,value)对写入到缓冲区之前,需要先进行分区操作,这样就能把map任务处理的结果发送给指定的reducer去执行写入环形内存缓冲区 map函数开始产生输出时并非简单地将它输出到磁盘。因为频繁的磁盘操作会导致性能严重下降。它的处理过程更复杂,数据首先写到内存中的一个缓冲区。
    当写入的数据量达到预先设置的阙值后便会执行一次I/O操作将数据写入到磁盘。每个map任务都会分配一个环形内存缓冲区,用于存储map任务输出的键值对(默认大小100MB,mapreduce.task.io.sort.mb调整

    spill(溢写)

    作用 把内存缓冲区中的数据写入到本地磁盘,在写入本地磁盘时先按照partition、再按照key进行排序(quick sort);
    一旦缓冲区内容达到阈值(mapreduce.map.io.sort.spill.percent,默认0.80,或者80%),就会会锁定这80%的内存,并在每个分区中对其中的键值对按键进行sort排序,具体是将数据按照partition和key两个关键字进行排序,排序结果为缓冲区内的数据按照partition为单位聚集在一起,同一个partition内的数据按照key有序。排序完成后会创建一个溢出写文件(临时文件),然后开启一个后台线程把这部分数据以一个临时文件的方式溢出写(spill)到本地磁盘中

    归并merge

    当一个map task处理的数据很大,以至于超过缓冲区内存时,就会生成多个spill文件。此时就需要对同一个map任务产生的多个spill文件进行归并生成最终的一个已分区且已排序的大文件。

    4.2 reduce端的shuffle

    复制copy,拉取数据

    Reduce进程启动一些数据copy线程,通过HTTP方式请求MapTask所在的NodeManager以获取输出文件

    merge阶段,合并拉取来的小文件

    merge 有三种形式:1)内存到内存 2)内存到磁盘 3)磁盘到磁盘。默认情况下第一种形式是不启用的。当内存中的数据量到达一定阈值,就启动内存到磁盘的 merge(图中的第一个merge,之所以进行merge是因为reduce端在从多个map端copy数据的时候,并没有进行sort,只是把它们加载到内存,当达到阈值写入磁盘时,需要进行merge) 。这和map端的很类似,这实际上就是溢写

    5. reduce阶段:

    把Mapper任务复制其输出的键值对,进行合并把分散的数据合并成一个大的数据 => 最后进行汇总。

  • 相关阅读:
    Haskell递归的基本概念和列表上的递归
    leetcode-54. 螺旋矩阵
    【mac端mysql】用户权限问题
    【第1期赠书活动】〖Python 数据库开发实战 - Python与MySQL交互篇④〗- 数据库连接池技术
    字节面试题——计算机网络,附答案
    C语言 内存
    JS中的 typeof 针对各种类型的返回值 以及typeof历史遗留问题
    Arduino开发实例-RCWL0516微波雷达传感器驱动
    API管理之利剑 -- Eolink
    python解析mdf或mf4文件利器---asammdf
  • 原文地址:https://blog.csdn.net/KEVIN_WANG333/article/details/126105359