shuffle: 洗牌,清洗。
// 源文件:
public static void main hello
hello static private asdfasdf ba c abc

public 1
static 2 
hello 2

*shuffle过程是MapReduce整个工作流程的核心环节
map : mapShuffle
reduce: reduceShuffle
 **1.在Map端的shuffle过程:Map输出的结果首先被写入缓存,当缓存满时,启动溢写(环形缓冲区(100M。80M))操作,把缓存写入磁盘文件,然后清空缓存,
2当启动溢写操作时,首先需要把缓存中的数据进行分区(partition),然后对每个分区进行排序(sort),合并(combine),
3之后再写入磁盘文件,每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,会有越来越多的磁盘文件,然后通知相应的Reduce来领取属于自己的数据
 **2.在Reduce端的shuffle过程,Reduce任务领回属于自己的数据后,然后对数据进行归并(Merge)然后交给Reduce处理
2.Map端的shuffle
**Map端的shuffle包括四个步骤
1.    输入数据和执行Map任务:Map输入的数据一般保存在HDFS文件块中,这些文件块的格式可以是任意的
2.    写入缓存:每个Map任务都会被分配一个缓存,Map输出的结果不是立即写入磁盘,而是首先写入缓存,积累一定缓存后,再一次性批量写入磁盘,这样可以大大减少对磁盘IO的影响,因为每次磁盘寻址开销很大,在写入缓存之前,键值对都会被序列化成字节数组
3.    溢写(分区,排序,合并):提供给MapReduce的缓存容量是有限的,默认大小100MB,随着Map任务的执行,缓存会越来越多,这时就必须启动溢写操作(spill),溢写过程通常是由另一个单独的后台线程来完成,但是为了保证Map任务写入缓存不受溢写影响,一般设置一个溢写比例0.8,在溢写到磁盘之前,缓存中的数据首先会被分区(partition)(),MapReduce通过Partitioner接口对这些键值对进行分区,采用默认的分区方式是Hash函数对key进行哈希后再用Reduce任务的数量进行取模,这样就可以把Map输出结果均匀的分配给所有的Reduce去并行处理,当然也可以自定义分区机制,对于分区内的每个键值对,后台线程会根据key对他们进行排序(sort),排序是MapReduce的默认操作,排序结束后还包含一个可选的合并(combine)操作,如果用户事先没有定义combiner函数,就不用进行合并,如果定义了,这个操作会减少需要溢写到磁盘的数据量,合并就是把相同key的value加起来,减少键值对的数量,功能与Reduce相似,但是并不是所有的场合都可以使用combiner,因为combiner的输出是Reduce的输入,combiner绝不能改变Reduce的计算结果,一般在累加,最大值的这种场景使用,每次溢写操作都会生成一个新的溢写文件,所有写入这个文件中的数据都是经过分区和排序的。
4.    文件归并:在Map任务结束之前,系统会对所有的溢写文件进行归并(Merge),生成一个大的溢写文件,归并就是对具有相同key的键值对合并,形成一个新的键值对,另外,在文件归并时,如果磁盘中生成溢写文件的数量超过min.num.spills.for.combine的值时(默认是3,用户可以修改),那么就可以再次运行combiner对数据进行合并操作,从而减小写入磁盘的数据量
 ****经过上述四个步骤后,Map端的shuffle过程全部完成,最终生成的大文件会被存放在本地磁盘中,这个大文件中的数据是被分区的,不同的分区分发到不同的Reduce任务进行并行处理,JobTracker会一直监测Map任务的执行,当监测到一个Map任务完成后,就会立刻通知相关的Reduce任务来领取数据,开始Reduce端的shuffle过程。
3.Reduce端的shuffle
 **Reduce端的shuffle包括三个步骤:
1.    领取数据:Map端的shuffle过程结束后,结果会保存在本地磁盘中,Reduce任务只需要把这些数据领取(Fetch)回来存放到自己机器所在的磁盘上,因此,每个Reduce任务在执行之前,大部分时间都在领数据,每一个Reduce会不断通过RPC向JobTracker询问Map任务是否已经完成
2.    归并数据:领回数据后,会首先被存在Reduce任务所在机器的缓存中,如果缓存满了,就会像Map一样发生溢写操作,由于在shuffle阶段,真正的Reduce还没有执行,这时可以把内存的大部分空间分配给shuffle过程作为缓存,缓存中的数据是来自不同机器的,一般会存在很多可以合并(combine)的键值对,当溢写程序启动时,具有相同key的键值对会被归并,如果用户定义了combiner,则归并后还可以执行combiner,减少写入磁盘的数据量,每个溢写过程结束后,都会在磁盘生成一个溢写文件,当溢写文件过多时也会像Map一样被归并成一个大文件,归并是也会进行排序,当数据很少时,写入缓存就行,不需要溢写到磁盘,而是直接在内存中执行归并操作,直接输出给Reduce任务,需要说明,把这些溢写文件归并成一个大文件需要多轮归并操作,每轮归并操作的文件数量有参数io.sort.factor来决定(默认是10,可以修改)
3.    把数据输入Reduce任务:磁盘中经过多轮归并后得到若干个大文件,不会继续归并成一个新的大文件,而是直接输出给Reduce任务,这样可以减少磁盘的读写开销,这样整个shuffle过就结束了,接下来Reduce任务会执行Reduce函数中定义的各种映射,输出最终结果,并保存到分布式文件系统中。

总结:
   map task 从split中读取数据,进行处理后,输出key/value,对键值对进行Partitioner后,存入到缓存中,缓存默认大小是100M,当缓存内容达到80M时,启动溢写操作,把缓存区数据写入一个溢写文件,在写入文件之前,会对键值对进行分区排序和合并(如果设置的话),当该map task处理完所有数据后,需要对该map生成的所有溢写文件进行merger操作,生成一个文件作为该maptask的成果,reduce task接受到通知后,就回拉取各个map task的成果数据,放到缓存区中,当缓存区内容达到阀值时,同样执行溢写操作,生成溢写文件,当把所有的map task的成果数据读取完毕后,会把生成的所有溢写文件进行merge操作,生成一个文件作为reduce task的输出数据。

shuffle过程简介相关推荐

  1. 2.27 MapReduce Shuffle过程如何在Job中进行设置

    一.shuffle过程 总的来说: *分区 partitioner *排序 sort *copy (用户无法干涉) 拷贝 *分组 group 可设置 *压缩 compress *combiner ma ...

  2. 【Big Data - Hadoop - MapReduce】通过腾讯shuffle部署对shuffle过程进行详解

    摘要: 通过腾讯shuffle部署对shuffle过程进行详解 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都 ...

  3. 【转】MapReduce:详解Shuffle过程

    --转自:{http://langyu.iteye.com/blog/992916} Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle ...

  4. 022 Spark shuffle过程

    1.官网  http://spark.apache.org/docs/1.6.1/configuration.html#shuffle-behavior Spark数据进行重新分区的操作就叫做shuf ...

  5. 详解shuffle过程(转载)

    http://langyu.iteye.com/blog/992916 shuffle本意是洗牌的意思.在mapreduce中描述的是怎么将map task 的输出结果有效的传送到reduce tas ...

  6. mapreduce shuffle过程

    转自http://langyu.iteye.com/blog/992916 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了 ...

  7. hadoop: Shuffle过程详解 (转载)

    原文地址:http://langyu.iteye.com/blog/992916 另一篇博文:http://www.cnblogs.com/gwgyk/p/3997849.html Shuffle过程 ...

  8. UA MATH565C 随机微分方程II Wiener过程简介

    UA MATH565C 随机微分方程II Wiener过程简介 Wiener过程的简单性质 Wiener过程的定义 在上一讲我们定义了WtW_tWt​: dWt=ηtdt⇔Wt=∫0tηsdsdW_t ...

  9. Hadoop计算中的Shuffle过程

    2019独角兽企业重金招聘Python工程师标准>>> Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce,Shuffle是必须要了解的 ...

最新文章

  1. java bitmap base64_Android Bitmap到Base64字符串
  2. JZOJ 5068. 【GDSOI2017第二轮模拟】树
  3. Spring boot集成mongodb
  4. java城市公交查询系统案例_013JAVA.JSP城市公交查询系统.zip
  5. Python如何发布程序
  6. kohana3 数据库模块配置
  7. “猜心思”的Hard模式:问答系统在智能法律场景的实践与优化
  8. Ansible playbook
  9. 一步一步學習partition之range分區如何創建
  10. 通过镜像快速搭建本地yum源
  11. 【转载】漏洞 CNVD-2017-36682 相关公告以及 JavaScript / 安卓开发者须知
  12. 软件测试面试题:智力题。
  13. 应聘时计算机水平怎么说,计算机能力怎么填_计算机水平怎么写_简历
  14. java获取京东token_京东宙斯平台使用方法(accesstoken,appkey,appsecret参数和SDK的获取)...
  15. iOS系统录屏如何增加雷达波纹效果(从一个点向周围扩散)的简单实现
  16. 第十二届蓝桥杯省赛JAVA B组杨辉三角形个人题解
  17. 第六周学习周报20181015-20181021
  18. 制作elasticsearch 镜像_相册视频制作-相册视频制作App下载-
  19. 人生感悟--------藏锋
  20. 前端页面查看PDF文档内容总结

热门文章

  1. 第12周 oj 逆序输出
  2. 大学开学初计算机水平测试,大学新生计算机水平层次划分方法思考与探索
  3. 自卑心理和自卑症的典型表现以及治疗方法
  4. 菜单 java,java菜单的实现
  5. 通过SimpleApp例程理解绑定的流程(三)
  6. 搜索引擎技术介绍(GIF图)
  7. 【blender】材质球参数及各种问题
  8. Codeforces Round #782 (Div. 2)
  9. 剪断的翅膀,如何起飞
  10. 《大数据数学基础Python版》读书笔记一