- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
shuffle过程解析
Shuffle过程介绍
MapReduce的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过程,如图所示:
Spill过程
Spill过程包括输出、排序、溢写、合并等步骤,如图所示:
Collect
每个Map任务不断地以对的形式把数据输出到在内存中构造的一个环形数据结构中。使用环
形数据结构是为了更有效地使用内存空间,在内存中放置尽可能多的数据。
这个数据结构其实就是个字节数组,叫Kvbuffer,名如其义,但是这里面不光放置了数据,
还放置了一些索引数据,给放置索引数据的区域起了一个Kvmeta 的别名,在Kvbuffer 的一
块区域上穿了一个 IntBuffer (字节序采用的是平台自身的字节序)的马甲。数据区域和索
引数据区域在Kvbuffer 中是相邻不重叠的两个区域,用一个分界点来划分两者,分界点不
是亘古不变的,而是每次 Spill之后都会更新一次。初始的分界点是0,数据的存储方向是
向上增长,索引数据的存储方向是向下增长,如图所示:
Kvbuffer 的存放指针bufindex是一直闷着头地向上增长,比如bufindex初始值为0,一个
Int型的key写完之后,bufindex增长为4,一个Int型的value写完之后,bufindex增长
为8。
索引是对在kvbuffer 中的索引,是个四元组,包括:value的起始位置、key的起始位置、
partition值、value的长度, 占用四个Int长度,Kvmeta 的存放指针Kvindex每次都是
向下跳四个 “格子”,然后再向上一个格子一个格子地填充四元组的数据。比如 Kvindex
初始位置是-4,当第一个写完之后,(Kvindex+0)的位置存放value的起始位置、(Kvindex+1)
的位置存放key 的起始位置、 (Kvindex+2)的位置存放partition 的值、(Kvindex+3)的位
置存放value的长度,然后Kvindex跳到-8位置,等第二 个和索引写完之后,Kvindex跳
到-32位置。
Kvbuffer 的大小虽然可以通过参数设置,但是总共就那么大,和索引不断地增加,加着加
着,Kvbuffer总有不够用的那天,那怎么办?把数据从内存刷到磁盘上再接着往内存写数
据,把 Kvbuffer 中的数据刷到磁盘上的过程就叫Spill,多么明了的叫法,内存中的数据
满了就自动地spill到具有更大空间的磁盘。
关于Spill 触发的条件,也就是Kvbuffer用到什么程度开始Spill,还是要讲究一下的。
如果把Kvbuffer用得死死得,一点缝都不剩的时候再开始 Spill,那Map任务就需要等
Spill完成腾出空间之后才能继续写数据;如果Kvbuffer只是满到一定程度,比如80%的时
候就开始 Spill,那在Spill的同时,Map任务还能继续写数据,如果Spill够快,Map可
能都不需要为空闲空间而发愁。两利相衡取其大,一般选择后 者。
Spill这个重要的过程是由Spill线程承担,Spill线程从Map任务接到 “命令”之后就开
始正式干活,干的活叫SortAndSpill,原来不仅仅是Spill,在Spill之前还有个颇具争议
性的Sort。
回到顶部
Sort
先把Kvbuffer 中的数据按照partition值和key两个关键字升序排序,移动的只是索引数
据,排序结果是Kvmeta 中数据按照partition为单位聚集在一起,同一partition 内的按
照key有序。
回到顶部
Spill
Spill线程为这次Spill过程创建一个磁盘文件:从所有的本地目录中轮训查找能存储这么
大空间的目录,找到之后在其中创建一个类似于 “spill12.out”的文件。Spill线程根据
排过序的Kvmeta挨个part
文档评论(0)