Shuffle过程详解
Shuffle过程详解
Shuffle过程是MapReduce的核心,最近看了很多资料,网上说法大体相同,但有些地方有一点点出入,就是各个阶段的执行顺序
总个shuffle过程可以看做是从map输出到reduce输入的这个中间过程,在这个中间过程中,经过了一系列的步骤
下面看看官方给出的图
Map端
下面是我画的一张图
1.Input Split分配给Map
2.Map过程进行处理,Mapper任务会接收输入分片,然后不断的调用map函数,对记录进行处理。处理完毕后,转换为新的<key,value>输出。(其中每个分片对应一个map,一个map可以被调用多次来处理该分片)
3.Map的输出结果缓存在内存里
4.内存中进行Partition,默认是HashPartitioner(采用取模hash (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks), 目的是将map的结果分给不同的reducer,有几个Partition,就有几个reducer,partition的数目可以在job启动时通过参数 “-Dmapreduc.job.reduces”设置(Hadoop 2.2.0), HashPartitioner可以让map的结果均匀的分给不同机器上的reducer,保证负载均衡。
5.内存中在Partition结束后,对于不同分区的数据,会按照key进行排序,这里的key必须实现WritableComparable接口。该接口实现了Comparable接口,因此可以进行比较排序
6.对于排序后的<key,value>,会按照key进行分组。如果key相同,那么相同key的<key,value>就被分到一个组中。最终,每个分组会调用一次reduce函数
7.排序分组结束后,相同的key在一起组成了一个列表,如果设置过combiner,就合并数据,减少写入磁盘的记录数(combiner本质就是一个reducer)
8.当内存中buffer(default 512M)达到阈值(default 80%),就会把记录spill(即溢写)到磁盘中,优化Map时可以调大buffer的阈值,缓存更多的数据。
9.当磁盘中的spill文件数目比规定的文件数目多时,会多次调用combiner。在不影响结果的前下,Combiner可以被调用多次。(比如磁盘中的spill文件数目规定在个(包括)以上,当达到规定数量时, map的新的output会再次运行combiner,而如果磁盘中spill file文件就1~2个,就没有必要调用combiner)
10.Map结束时会把spill出来的多个文件合并成一个,merge过程最多10(默认)个文件同时merge成一个文件,多余的文件分多次merge,merge过程是merge sort的算法。
11.Map端shuffle完毕,数据都有序的存放在磁盘里,等待reducer来拿取
Reducer端
shuffle and sort的过程不仅仅在map端,别忘了reducer端还没拿数据呢,reduce job当然不能开启。
1. Copy phase: reducer的后台进程(default 5个)到被Application Master (Hadoop 2.2)指定的机器上将map的output拷贝到本地,先拷贝到内存,内存满了就拷贝的磁盘。
2. Sort phase(Merge phase): Reduer采用merge sort,将来自各个map的data进行merge, merge成有序的更大的文件。
3. 如果设置过Combiner,merge过程可能会调用Combiner,调不调用要看在磁盘中产生的文件数目是否超过了设定的阈值。(这一点我还没有确认,但Combiner在Reducer端是可能调用。)
4. Reduce phase: reduce job开始,输入是shuffle sort过程merge产生的文件。
转载自 http://blog.csdn.net/tanggao1314/article/details/51679246
Shuffle过程详解相关推荐
- MapReduce:Shuffle过程详解
MapReduce:Shuffle过程详解 1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数. & ...
- hadoop: Shuffle过程详解 (转载)
原文地址:http://langyu.iteye.com/blog/992916 另一篇博文:http://www.cnblogs.com/gwgyk/p/3997849.html Shuffle过程 ...
- MapReduce内部shuffle过程详解(Combiner的使用)
Maptask调用一个组件FileInputFormat FileInputFormat有一个最高层的接口 --> InputFormat 我们不需要去写自己的实现类,使用的就是内部默认的组件: ...
- Hadoop之Shuffle机制详解
Hadoop之Shuffle机制详解 目录 Shuffle机制 Partition分区 WritableComparable排序 Combiner合并 GroupingComparator分组(辅助排 ...
- 简历项目描述过程详解
简历项目描述过程详解 一.项目分点 1.1 集群规模 1.2 框架结构,画出来 1.3 框架 1.3.1 第一个Flume 1.3.1.1 碰到的问题 1.3.2 kafka 1.3.2.1 框架介绍 ...
- Spark 3.2.0 版本新特性 push-based shuffle 论文详解(二)背景和动机
前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...
- hadoop作业初始化过程详解(源码分析第三篇)
(一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...
- Hadoop学习之Mapreduce执行过程详解
一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
最新文章
- 超越技术分析_超越技术面试
- linux操作系统的特点包括什么,什么是Linux操作系统?有哪些主要特点?
- 剖析Elasticsearch集群系列第二篇 分布式的三个C、translog和Lucene段
- python opencv 界面按钮_PyAutoGUI:自动化键鼠操作的Python类库
- 【JavaSE04】Java中循环语句for,while,do···while-练习
- FLOW福禄创始人朱萧木:如何通过产品设计助力品牌营销传播
- Hive问题汇总记录,持续更新
- [深度学习-原理篇]什么是循环神经网络RNN与LSTM
- oracle配置控制文件快照的位置以及名称为,oracle的备份与恢复
- 量子计算机 计算混沌,深入了解量子混沌可能是量子计算机的关键
- java求最后一位不为0的数字_【Java】 剑指offer(62) 圆圈中最后剩下的数字
- 【分形算法】Jason带你飞之1——LS文法的java实现
- python内置函数每日一学 -- all()
- mp4文件如何转换为webm格式 1
- Dialog的高冷用法
- Day 18-Vue3 技术_新的组件
- 大数据技术与应用4-4MapRuduce
- office2016 下载路径
- 9.1 什么是包图?
- java逻辑测试题_《Java理解程序逻辑试题分析》