combiner其实就是Reducer类型:
Class<? extends Reducer<K,V,K,V>> cls =
(Class<? extends Reducer<K,V,K,V>>) job.getCombinerClass();
Combiner的运行时机:
MapTask:
①每次溢写前,如果指定了Combiner,会运行
②将多个溢写片段,进行合并为一个最终的文件时,也会运行Combiner,前提是片段数>=3
ReduceTask:
③reduceTask在运行时,需要启动shuffle进程拷贝MapTask产生的数据!
数据在copy后,进入shuffle工作的内存,在内存中进行merge和sort!
数据过多,内部不够,将部分数据溢写在磁盘!
如果有溢写的过程,那么combiner会再次运行!
①一定会运行,②,③需要条件!