MapReduce的Shuffle过程

在这里插入图片描述1、map方法写完数据,调用分区函数,确定自己所在分区。然后写入环形缓冲区,环形缓冲区分两半,一般记录key和value的值,另一半记录分区数,key和value在缓冲区的地址,缓冲区默认100M。
2、环形缓冲区达到80%的时候进行溢写,溢写时分区存储,并进行了排序(快速排序)。然后写入磁盘。
3、排完顺序后,可以用combiner进行一次map端的数据的合并,视情况而使用。
4、每次缓冲区溢写后都会生成新的文件,当map将所有数据读完后,根据不同分区进行不同的文件的归并排序。
5、归并排序属于外部排序,需要将排序的内容部分读入内存,进行多路归并(多路具体是几路看配置)。
6、排完顺序的是整个map的所有数据,可以进行combiner整合,然后存入磁盘。
7、可以针对不同分部的数据进行压缩。最后写入磁盘。
8、多个map完成任务后,开启reduse。
9、map完成,会有很多分区的数据在不同服务器上。
10、同居设置的分区数,会开启相应数量的ReduceTask。
11、不同的ReduceTask拉取自己相对应的分区的内容,进行归并排序。
12、归并完的分区进行Reduce处理,reduce处理时,会根据自己的分组规则进行分组调用reduce方法。
13、最后将数据写出到输入文件。

mapTask任务:
并行处理数据,根据切片信息,具体划分mapTask的数量。
切片:
切片方法在InputForMat中,默认的是FileInputFormat,切片方式,首先根据文件切,文件大于128M会被切成多片,hadoop2.X默认128M。切片的时候会先验证大小是否大于128的1.1倍,大于才会切,否则算一片,不再切分。也可自己调整默认切片的大小去切片。
map读取数据:
根据相应的RecordReader类定义的读取方式进行读取。默认是TextInputFormat。
Combiner:
继承与Reducer,跟其作用类似。不同的是Combiner在mapTask运行行,Reducer在ReduceTask阶段运行。主要整合map阶段数据,减小网络IO,使用的前提是不影响业务逻辑。
Partintioner分区:
默认一个分区,可以自定义分区,集成Partioner实现其方法即可。在启动类中绑定分区数量,就会开启相应的reduceTask。
sort 排序:
整个shuffle过程有3个排序阶段,1、缓冲区吸入磁盘2、map完成的归并3Reduce拉取数据后的归并。基本bean继承writerCpmparlae实现排序方法,排序的时候就会自动调用。
goup 分组(实际也是用排序来实现的,默认使用bean定义的比较方法排序)
我们发现在reduce方法中,value是个迭代器。其主要作用就是分组。MR的分组的前提是该分组条件有序,其分组采用的向下比较分方式确定是否为一组。如果不为一组就跳出reduce方法,其内部会再次调用reduce方法,进行处理。分组和排序都是按照key进行的。可以实现一个GroupSort方法,继承WriterComplator类,重写其构造器和比较方法,reduce的时候会调用这个方法进行验证是否为同一组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值