shuffle过程

1、一个大文件需要处理,它在在HDFS上是以block块形式存放,每个block默认为128M存3份,运行时每个map任务会处理一个split,如果block大和split相同,有多少个block就有多少个map任务,所以对整个文件处理时会有很多map 任务进行并行计算;
2、每个map任务处理完输入的split后会把结果写入到内存的一个环形缓冲区,写入过程中会进行简单排序,它的默认大小为100M(可以配置mapred-site.xml:mapreduce.task.io.sort.mb),当缓冲区的大小使用超过一定的阀值(mapred-site.xml:mapreduce.map.sort.spill.percent,默认80%),一个后台的线程就会启动把缓冲区中的数据溢写(spill)到本地磁盘中(mapred-site.xml:mapreduce.cluster.local.dir),同Mapper继续时向环形缓冲区中写入数据;
3、数据溢写入到磁盘之前,首先会根据reducer的数量划分成同数量的分区(partition),每个分区中的都数据会有后台线程根据map任务的输出结果key2进行内排序(字典顺序、自然数顺序或自定义顺序compare to),如果有combiner,它会在溢写到磁盘之前排好序的输出上运行(combiner的作用是使map输出更紧凑,写到本地磁盘和传给reducer的数据更少),最后在本地生成分好区且排好序的小文件;
如果map向环形缓冲区写入数据的速度大于向本地写入数据的速度,环形缓冲区被写满,向环形缓冲区写入数据的线程会阻塞直至缓冲区中的内容全部溢写到磁盘后再次启动,到阀值后会向本地磁盘新建一个溢写文件;
4、map任务完成之前,会把本地磁盘溢写的所有文件不停地合并成得到一个结果文件,合并得到的结果文件会根据小溢写文件的分区而分区,每个分区的数据会再次根据key2进行排序,得到的结果文件是分好区且排好序的,可以合并成一个文件的溢写文件数量默认为10(mapred-site.xml:mapreduce.task.io.sort.factor);这个结果文件的分区存在一个映射关系,比如0~1024字节内容为0号分区内容,1025~4096字节内容为1号分区内容等等;
5、reduce任务启动,Reducer个数由mapred-site.xml的mapreduce.job.reduces配置决定,或者初始化job时调用Job.setNumReduceTasks(int);Reducer中的一个线程定期向MRAppMaster询问Mapper输出结果文件位置,mapper结束后会向MRAppMaster汇报信息;从而Reducer得知Mapper状态,得到map结果文件目录;
6、当有一个Mapper结束时,reduce任务进入复制阶段,reduce任务通过http协议(hadoop内置了netty容器)把所有Mapper结果文件的对应的分区数据复制过来,比如,编号为0的reducer复制map结果文件中0号分区数据,1号reduce复制map结果文件中1号分区的数据等等,Reducer可以并行复制Mapper的结果,默认线程数为5(mapred-site.xml:mapreduce.reduce.shuffle.parallelcopies);
所有Reducer复制完成map结果文件后,由于Reducer会失败,NodeManager并没有在第一个map结果文件复制完成后删除它,直到作业完成后MRAppMaster通知NodeManager进行删除;
另外:如果map结果文件相当小,则会被直接复制到reduce NodeManager的内存中(缓冲区大小由mapred-site.xml:mapreduce.reduce.shuffle.input.buffer.percent指定,默认0.7);一旦缓冲区达到reduce的阈值大小0.66(mapred-site.xml:mapreduce.reduce.shuffle.merge.percent)或写入到reduce NodeManager内存中文件个数达到map输出阈值1000(mapred-site.xml:mapreduce.reduce.merge.inmem.threshold),reduce就会把map结果文件合并溢写到本地;
7、复制阶段完成后,Reducer进入Merge阶段,循环地合并map结果文件,维持其顺序排序,合并因子默认为10(mapred-site.xml:mapreduce.task.io.sort.factor),经过不断地Merge后得到一个“最终文件”,可能存储在磁盘也可能存在内存中;
8、“最终文件”输入到reduce进行计算,计算结果输入到HDFS。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值