文档章节

MapReduce 的 shuffle 机制

firepation
 firepation
发布于 12/03 18:41
字数 923
阅读 174
收藏 5

由于 MapReduce 确保每个 reducer 的输入都是按键排序的,因此在 map 处理完数据之后传给 reducer 的这个过程中需要进行一系列操作,这个操作过程就是 shuffle。在《hadoop权威指南》中指出,shuffle 是 MapReduce 的 “心脏”,了解 shuffle 工作机制有助于我们优化 MapReduce 程序,接下来我们就来看看它的运行机制。

shuffle 流程

先用一张图表示 shuffle 的整个过程。从图中我们可以看到 shuffle 流程主要是对 map 的数据进行排序、分组发送给 reduce 后再进行合并的一个过程,我们将分 map 和 reduce 两个部分来讲解 shuffle 的流程。

shfulle机制

map 端 shuffle

map 任务开始产生数据时,会先将这些数据存储在一个 内存缓冲区 中,这个缓冲区大小默认为 100MB,可以通过设置 mapreduce.task.io.sort.mb 来改变其大小。由于 hadoop 处理的是海量数据,100MB 的内存显然是不够用的,因此达到一定 阈值 时(默认为 0.8,可以通过设置 mapreduce.map.sort.spill.percent 来改变其大小),会将内存中的内容溢出(spill)到磁盘当中,溢出的路径是由 mapreduce.cluster.local.dir 属性指定的。在溢出到磁盘的过程中,如果缓冲区中还有空间,map 程序会继续输出数据到缓冲区中,如果没有空间的话,map 输出程序则会阻塞直到数据写入到磁盘后。

在上图中 buffer in memory(输出到缓存中) 和 merge on disk(合并到磁盘) 这两个步骤中间还有一个 分区、排序 的步骤。分区能达到跟分组类似的效果,例如读取一个含有大量电话号码的数据时,把 138 的分为一组,把 135 分为一组。这个效果可以通过自定一个类继承 Partitioner,然后在 Job 中调用 setPartitionerClass 方法设置分区类来完成。在每个分区中,后台线程按照键的值对数据在内存中进行排序,如果有一个 combiner 方法,则在排序完成之后运行它。combiner 方法会使 map 输出更紧凑,减少写到磁盘中的数据和传给 reducer 的数据。

一般情况下,map 的输出结果并不会进行压缩,由于数据量大,对网络资源的耗费很大,为了对 mapreduce 程序进行优化,我们可以将 mapreduce.map.output.compress 属性设置为 true,这样当 map 将数据写到磁盘时就会对数据进行压缩。具体的压缩格式可以通过 mapreduce.map.output.compress.codec 属性来设置。当所有记录都写完之后,map 会合并全部的溢出文件为一个分区且排序的文件传给 reduce。

reduce 端 shuffle

reducer 通过 HTTP 的方式获取 map 的的输出数据,这是复制阶段。reducer 在复制阶段把 Map 输出复制到 Reducer 的内存或磁盘,一个 Map 任务完成后,Reduce 就开始复制输出。复制完所有的 map 输出之后,reducer 对这些数据进行合并,使它们仍然保持有序。合并完成之后,直接将这些数据输入到 reduce 函数中,从而省略一次写入磁盘的时间。至此,整个 shuffle 流程就完成了。

以上便是我对 MR shuffle 机制的理解,如果其中有错,欢迎指出。

© 著作权归作者所有

共有 人打赏支持
下一篇: YARN 运行机制
firepation
粉丝 3
博文 31
码字总数 41236
作品 0
福州
程序员
私信 提问
国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置

简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster。这次大变革被称为MRv2或者YARN,是一次革命性的变化。 配置 在前面...

吴超沉思录
2014/01/26
0
0
hadoop 学习笔记:mapreduce框架详解

这个觉得写得特别的详细,有一些细节可能要去看书,会理解的更好点,,,   Mapreduce初析   Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapre...

LIPING234
2013/10/25
0
0
Hadoop上路_12-MapReduce流程演示

MapReduce是单个jobstracker和多个tasktracker的组合。一般jobstracker和HDFS中的namenode在同一个节点,也可配置为单独节点;tasktracker和datanode必须是同一个节点。jobstracker是整个Map...

vigiles
2013/08/08
0
0
大数据经典学习路线(及供参考)之 一

1.Linux基础和分布式集群技术 学完此阶段可掌握的核心能力: 熟练使用Linux,熟练安装Linux上的软件,了解熟悉负载均衡、高可靠等集群相关概念,搭建互联网高并发、高可靠的服务架构; 学完此...

柯西带你学编程
05/22
0
0
Reduce连接(reduce-side joins)

如果没有一个 map-side join 技术适合我们的数据集,那么就需要在 MapReduce 中使用 shuffle 来排序和连接两个数据集。这称为 reduce-side joins,也叫”重分区连接”。 【例】基本的重分区连...

天行自息
11/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

线程安全性--volatile

volatile:当多个线程进行操作共享数据时,可以保证内存中的数据是可见的; @Slf4jpublic class MyVolatile { public static void main(String[] args) { ThreadRun threadRun...

wuyiyi
17分钟前
1
0
大数据入门之hadoop相关概念知识点整理

Hadoop是一个开源框架,允许使用简单的编程模型在跨计算机集群的分布式环境中存储和处理大数据。它的设计是从单个服务器扩展到数千个机器,每个都提供本地计算和存储。今天整理了一些关于had...

技术阿飞
18分钟前
1
0
ssh 免登

ssh-copy-id三步实现SSH无密码登录和ssh常用命令 ssh-copy-id -i .ssh/id_rsa.pub 用户名字@192.168.x.xxx

miaojiangmin
20分钟前
1
0
2018阿里云双12年终大促主会场全攻略

2018阿里云双12年终大促活动已经于12月7日正式开启,从已开放的活动页面来看,活动分为两个阶段: 12月7日-12月23日的拉新返现阶段和12月24日-12月28日的TOP100英雄榜PK阶段。 活动核心亮点:...

阿里云官方博客
21分钟前
1
0
聊聊flink的MemoryStateBackend

序 本文主要研究一下flink的MemoryStateBackend StateBackend flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/StateBackend.java @PublicEvolvingpublic interface......

go4it
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部