本地优化-Combine
定义:
数据经过Map端输出后会进行网络混洗,经Shuffle后
进入Reduce,在大数据量的情况下会造成大量网络开销。
所以可以在本地按照key先进性一轮排序与合并,
再进行网络混洗,这个过程就是Combine
大多数情况Combine的逻辑和Reduce的逻辑是一致的
可以认为combine是对本地数据的Reduce操作
这里复用Reduce的逻辑,当然也可以实现Combine类
job.setCombinerClass(MyReduce.class);//设置Combine
job.setReducerClass(MyReduce.class);//设置Reducer
从Map到Reduce阶段
有三个任务分片,map的任务就有3个
经过map类处理后,输出到内存缓冲区(默认大小100M),超过一定大小后,文件溢写到磁盘上,按照key分类
按照key合并成大文件,减少网络开销
所有相同key的数据汇集到一个partition
将相同的key value汇聚到一起,
但不计算!!!
经过Reduce处理,文件名是固定的
partition 、Reduce、输出文件数量相等
在一个Reduce中,所有的数据都会被按照key值升序排序,所以如果part食醋胡文件中包含key,那么这个文件一定是有序的
Reduce任务数量
在大数据量的情况下,如果只设置1个Reduce任务,其他节点将被闲置,效率底下
所以将Reduce设置成一个较大的值(max:72)
调节Reduce任务数量的方法
一个节点的Reduce任务数并不像Map任务数那样受多个因素制约
- 通过参数调节mapred.reduce.tasks(在配置文件中)
- 在代码中调用job.setNumReduceTasks(int n)方法(在code中)