MapReduce-shuffle详解

本文深入解析MapReduce计算模型中的Shuffle过程,阐述其在Map端和Reduce端的作用,包括Spill过程、数据溢写、合并及combiner的运用,揭示MapReduce如何高效处理大规模数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shuffle粗解

shuffle:本意是洗牌、混洗,把一定有规则的数据尽量转换成一组无规则的数据,越随机越好。
MapReduce中的Shuffle更像是洗牌的逆过程,把一组无规则的数据尽量转换成一组有规则的数据。

为什么MapReduce计算模型需要Shuffle过程?

MapReduce计算模型一般包括两个重要的阶段:Map是映射,负责数据的过滤分发;Reduce是规约,负责数据的计算归并。
Reduce的数据来源于Map,Map的输出既是Reduce的输入,Reduce需要通过Shuffle来获取数据。

从Map输出到Reduce输入的整个过程可以广义地称为Shuffle。Shuffle横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和sort过程。

Shuffle过程:

map端:(Spill过程:包括输出,分区,排序,溢写,合并等)

1、一个map任务由一个输入的切片来决定,一个切片产生一个map
2、每个map任务不断地以键值对的形式把数据输出到在内存中构造的一个环形缓冲区中。(使用环形缓冲区是为了更有效地使用内存空间,在内存中放置尽可能多的数据)
      注:a、环形缓冲区其实就是一个字节数组,kvbuffer
             b、环形缓冲区中放置了元数据和原始数据(数据)
             c、 原始数据(数据)存放在右边,元数据存放在左边。
             d、数据的存储方向是向上增长,元数据是向下增长。
             e、元数据的组成:四个元祖(value的起始位置、key的起始位置、partition值,value的长度)
3、数据从进入环形缓冲区后就开始进行分区,排序,排序是把缓冲区中数据按照partition值和key两个关键字升序排序,但是只移动元数据。(排序结果是Kvmeta(元数据)中数据按照partition为单位聚集在一起,同一partition内的按照key有序。)
4、环形缓冲区的大小默认为100M,当达到阈值0.8时,一个后台线程会把内容溢写到磁盘指定的目录下,形成一个小文件
5、map任务如果输出数据量很大,可能会进行好几次spill,也会产生很多文件,分布在不同的磁盘上此时就需要merge过程把这些小文件进行合并成一个大文件作为map端的输出
       注:merge过程就是拿取所有排好序的“第一个”分区 …
至此:Map端的Shuffle过程结束,(map的输出数据是有序的)

Reduce端:(copy(拉取),sort)

6、Reduce任务通过HTTP协议向各个map任务拉取所需要的数据,拉取的同时进行排序,一个map数据过来就会创建一个文件
7、当文件数量达到一定的阈值时,开始启动磁盘文件merge,把这些文件合并输出到一个文件。
      注:merge过程就是拿取所有map端排好序的“第一个”分区 …
Reduce端Shuffle结束

combiner:(map端的Reduce)

1、排序之后combiner
2、若溢写文件超过三个还会触发combiner
3、在reduce端merge时还会combiner

相关配置

map的数量由InputSplit确定,默认的InputSplit与block块大小一致
reduce数量必须和分区数相同或大于分区数,但是若大于分区数会造成资源浪费
reduce的数量由配置文件中mapred.reduce.tasks指定,如果不指定则默认为1

shuffle官方图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值