Shuffle流程

在这里插入图片描述

它要规划一个任务,是不是就是规划下有多少个map,有多少个reduce任务,然后在那些机器上再去启动,所以它事先肯定先去规划,要规划它肯定就得去计算用多少个切片,其实在源码里面就可以看到它在哪里计算,拿了多少个切片。

map输出的数据到reduce之间,我们说框架做了很多的事,缓存,分组,排序,转发,这一部分细节其实是很重要的,这个叫作MapReduce里面的Shuffle机制。
在这里插入图片描述

1)这幅图是不是描述了一个具体的map进程,它输出的数据是这么缓存起来,然后是怎么转发给reduce,这中间是怎么缓存,排序和分组的,这个过程就叫做Shuffle过程。这Shuffle过程其实是分到整个集群里面协作起来运行的,每个maptask都参与了这个Shuffle的过程

2)这个MapTask呢,首先是一个map任务是由一个输入的切片决定的来产生一个map的,我们的数据,逻辑上就是一个切片,它呢就产生一个map进程,这个map进程把它处理完的结果是不是输出一些key value ,输出的key value呢,它首先是放在本地的一个内存的缓存里面,这个MapTask是不是在这个集群里面好多好多的并发执行,每个的输出都把它放在自己的内存里面,有一个内存缓冲区,内存里面的buffer,这个buffer的大小也是可以通过配置文件来指定的,这个缓冲区有多少M,多少G是可以通过缓冲区来指定的,配置文件即 io.sort.mb属性下,这下面可以改大小,若不改的话默认大小是100MB,那么我MapTask处理完这个切片,这个切片很可能 就是一个block,即128M,甚至我们切片调的比较大,那么map输出的内容和也会远远超过100M ,那么这个输出结果就不能完完整整的在这个内存里面全部缓存起来了,内存里面缓存不下了,会怎么办呢?

2) 它就会溢出到磁盘文件中去,它会溢出到磁盘中去写一个小文件。

3)而且它在写这些小文件的时候,就是那些key value ,写的时候,它就事先给它分组,分好组写。这个文件里面看是不是个连续的东西,某一段是不是都是同一个组的,接着就是第二组的,接着就是第三组的key value,它是这个分好组写的,而且它每一组里面根据key,它排好了序,key value 输出去的时候,先给他分组,再给它排好序写到文件里面,但是这个文件也不能写的太大,你不能一直溢出,把这个文件写得很大,因为写得越大,你要在这个文件里面插入数据就越难,比如说又来了一组,第二组的,你是不是得插入到第二个格子里面,在这个文件里面插数据是不是很麻烦,所以这个文件不能太大,这个文件也有一定的大小,也可以用配置文件去写,那万一那个文件达到你配的那个大小了,就把多的溢出到一个新的小文件里面。

4) 如果这个文件再写满了,是不是又再溢出到一个新的文件里面,那么在这个map进程执行的过程中,它的数据是不是会缓存到磁盘很多小文件里面啊,这个小文件写的时候,是不是还要分组排序的,是不是你发现这里面会很慢,要分组要排序,要插入到那个磁盘里面去,肯定很慢,所以MapReduce为什么慢,就是因为它要写磁盘,写磁盘是不是就很慢,如果它所有的东西 都在内存里面完成,速度肯定会块很多的,但是你内存里面太多是不是放不下啊,所以MapReduce呢就是适合处理那种真的是海量数据,因为我可以把那些处理过程中的缓存结果放到磁盘上,磁盘是不是很大的,我每一台节点都有好几个T把,所以它适合做真实的海量数据处理,但现在我们很多运算框架。

比如说

**spark,storm,**它们就不会去往磁盘里面去写那些中间过程,中间结果它不会往磁盘写,它全在内存里面完成,当然你节点数量足够多,你也可以处理更多的数据,但是你跟这个磁盘比起来,你的这个量跟磁盘能是一个级别吗?绝对不在一个级别,所以现在spark、storm并把不能完全取代MapReduce,那些东西实在内存中运行,但是它实时性就会很高,但是它数据量是达不到MapReduce处理量的级别,所以MapReduce还是有自己的应用场景,做这种离线的,你对实时性的要求并不高,但是你的数据量真的很大,那么用MapReduce就比较合适。

5)map把自己map 的结果缓存到本地磁盘上的许多小文件,但是这个文件太多了,它最后在全部处理完之后,还做一件事情,就是把这些小文件再合并成一个大文件,合并的时候是怎么合并呢?每个小文件里面都有分区分组的,同一个组的放在大文件里面的一个组,而且里面他们写的时候,还会排序,因为在每一个小文件里面这个组里面是有序的,但是你把它们合起来,还能保证有序吗?不能了吧。

比如说
第一组里面有一个key:1 3 5 排好了序,
第二个小文件的第一组里面有8 10 11
第三小文件的第一组里面是2 7 9
你把它们3个合起来还是有序的吗?不是吧 --1 3 5 8 10 11 2 7 9

6)所以把同一组的key value全部再整合到一起,是不是又要重新拍一场序,所以是不是又很难耗时啊,合并之后,再写到大文件里面去.同样第二组又把它们合并一下,合并到大文件第二组,第三组等等。假设这个map的输出总共分成3个组,那是不是都处理完了,注意这只是一个map,别的map是不是也在做这个事情啊,它也会输出这样的大文件把,它的街而过是不是也有3个组啊。

7)这个时候在把它们都弄完之后,是不是要把它分发到reduce 里面去,分发到reduce里面去,第一组的是不是给某一个特定的reduce任务,所有map的第一组都给来了同一个reduce ,这个reduce就能拿到 所有的第一组,它是不是对第一组数据进行了汇总,要么就统计,输出,要么就干嘛。

8)那么它这么拿的时候,在这个map里面的第一组这个里面的数据是有序的,但是我在别的map里面的第一组拿过来的时候,又面临一个问题,它们分别有序,但那是全局无序,所以它把各个map里面拿过来的第一组数据是不是又做一次合并啊,这一次合并在哪里?-----reduce的节点上做合并,把你们的map输出的数据,第一组,第一组…全部到我这个reduce 上面来,我这个reduce再把这个数据再重新合并起来,合并的时候,又在磁盘上面去写和排序,最后是不是合并成了一个结果,然后传递给我那个reduce函数,reduce函数就能拿到这一组排好序的相关的数据。

比如
1 3 5 0000过来,然后好多好多value,
1 3 5 0001过来,好多好多value,
。。。。
然后他再输出结果,
这 整一个 过程就是Shuffle,什么是Shuffle,
洗牌,发牌,打牌的时候是不是洗牌发牌啊,把那些牌是不是组合了重新排序,然后再分发。

Shuffle里面重要一点,讲的是分组、排序,分组呢,怎么分,哪些key value 分到哪一组

我们是通过哪个东西来实现的-----PartitionPartition来实现,哪个key分到哪一组,排序怎么实现,是不是key你得实现一个Comparable,就能够对你进行一个正序或者倒序,所以Shuffle里面重要的功能就是分组和排序,再加上各种缓存机制,内存缓存,磁盘缓存,那么这个Shuffle是不是在整个集群里面协作完成的啊,每个map我都做一部分工作,reduce呢也做一部分工作,其实在具体的生产环境里面是可以进行调优的,你可以调整内存的缓存大小,首先他的大小你可以调,比如说你这个机器,你这个每个节点,这个maptask是不是运行在一个节点上 啊,你每一个节点的配置就很高,假设你这个服务器是64G内存,你这个Buffer是不可以大一点,大一点是不是可以尽可能降低它往磁盘里面去写文件的频率,这样可以提高把,那个调buffer,1.可以调大小 2.调阀值,它并不是写满了才溢出的,是达到阀值才溢出的,阀值是多少也是通过一个参数来控制的,即 io.sort.spill.percent,达到我这个缓存的多少才开始溢出,其实MapReduce后台还有一个线程把这个内容写到磁盘指定的目录里面去 marperd.local.dir 它是不是又耗CPU资源,又耗磁盘IO啊。

补充一点

刚才讲的时候,是map把整个输出结果是不是写成了一个文件,然后reduce是不是去拿这个文件里面的某个reduce是拿所有的maptask的这个结果文件里面的某一组把,问题在于这个reduce这个进程它哪里知道哪些节点上有那个map的输出结果啊?它哪知道哪些节点上运行了那个maptask?

它应该不知道吧,maptask它就只知道自己要做什么事把,它并不知道,我要的那些数据,比如说第一组,我要的第一组数据在哪?在哪些节点上,在那个节点的map结果文件的哪个偏移量是第一组,是不是它不知道,那么这个东西是依赖于谁去做呢?是谁会知道这个事情,然后告诉reduce去拿。

那个yarn框架里面的Rm知不知道,它不知道,它不懂什么是Map,也不懂什么是Reduce,谁懂?MapReduce里面应该有个做协调的角色-----MRAppMaster maptask.reducetask都是它启动起来了,都是由它来协调的。
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值