MapReduce的shuffle过程

本文详细介绍了MapReduce的shuffle过程,包括Map端的缓冲区写出、溢写排序、合并,以及Reduce端的数据拷贝、合并和形成输入。shuffle涉及数据拉取、磁盘IO和排序,是优化的重要方向。Map端数据按partition和key排序并可能应用combiner,多个溢写文件最终合并为一个。Reduce端通过Fetcher线程拉取数据,根据内存和磁盘情况合并,并在内存中使用优先级队列保持key有序,最终形成reduce任务的输入。
摘要由CSDN通过智能技术生成

shuffle是昂贵操作,因为shuffle操作不仅涉及到数据的拉取、溢写磁盘的IO操作还涉及排序合并等操作,如果能让shuffle的成本尽量降低也是一大优化的方向。本篇文章对应Hadoop2.6.5,只对应流程,具体细节,可以研究MapTask/ReduceTask/Shuffle等源码。

shuffle过程

一、Map端

1、起始点 - map任务已产生结果将写出

这一阶段可以称作缓冲区写出。在map任务完成后会将结果写入缓冲区,缓冲区的大小设置好了就是固定的,当写出的数据长度超过缓冲区剩余空间大小时,已写入缓冲区的结果将被溢写到磁盘上。

2、溢写过程 - 对应 sortAndSpill

每次溢写都产生一个溢写文件,写出之前对缓冲区数据进行排序(排序方式有两个:堆排序、快速排序,可以通过 “map.sort.class” 设置, 默认是快速排序,排序规则是先按 partition 排再按 key 排)。

可知,写出时同一 partiton 的数据 append 在一起。而且,如果设置了 combiner , 会对相同 key 进行 combine 操作,也就是 map 端 reduce。写出之后产生一个对应溢出文件的索引文件。

也就是说对于每一次溢出操作,都产生一个文件,这个文件中的数据是按分区和键排好序的。对于一个map任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值