mapreduce详细流程
2021-03-01 15:31:15 0 举报
shuffle阶段详解
作者其他创作
大纲/内容
split函数
Container
300M文件 a.txt
maptask1
归并排序
环形缓冲区1、放在我们内存当中2、大小为100M3、阈值 为百分之八十。
map的shuffle阶段
reducetask0
溢出为多个小文件
进入到环形缓冲区之后在溢写之前会对数据进行一次排序。 排序的方式是,先按照分区编号Partition进行排序,然后按照key进行排序。 这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序
InputFormatTextInputFormat
临时文件
中间文件
combiner合并
reducetask1
reduce缓冲区
7.Combiner的存在就是提高当前网络IO传输的性能,也是MapReduce的一种优化手段。8.实现自定义的Combiner1.因为源码中的Combiner是继承于Reducer,我们使用自己的Combiner就需要继承Reducer并重写reduce方法2.job中设置job.setCombinerClass(自定义Combiner的类.class)ps:需要注意一个点就是:Combiner就是一次Reducer类中reduce方法的实现,所以这里的KV需要和Reducer的KV是一致的
merge合并
分区0
maptask3
分区1
Outputforamt输出。TextOutputFormat
1.Combiner是MR程序中Mapper和Reduce之外的一种组件2.Combiner组件的父类就是Reducer3.Combiner和Reducer之间的区别在于运行的位置4.Reducer是每一个接收全局的Map Task 所输出的结果5.Combiner是在MapTask的节点中运行6.每一个map都会产生大量的本地输出,Combiner的作用就是对map输出的结果先做一次合并,以较少的map和reduce节点中的数据传输量
block3
缓冲区大小一般设置48M
parittion自定义分区实现: (1)创建一个类继承Partitioner。 (2)重写里面的getPartition方法,return 数字几就将当前数据写到第几个分区。 (3)在驱动类指定自定义分区 job.setPartitionClass()(4)指定相同数量的ReduceTast job.setNumReduceTasks()
根据分区的数量来启动相应数量的Reduce Task
reduce阶段shuffle
maptask2
block1
block2
Outputforamt输出。TextOutputFormat
0 条评论
回复 删除
下一页