在Hadoop中默认运行一个reduce,所有reduce任务会放到一个单一的reduce中去执行。
比较好的配置reduce数量是根据集群中所有的reduce任务槽的数目,一般认为集群节点中运行reduce任务节点及机器数目的2倍,因为每个节点上默认使用2个任务槽。
reduce任务的具体数量是由
Mapred.Reduce.Tasks属性设置。
在本地环境中进行任务处理的时候,即构建本地测试环境时,必须有0个或者1个reduce。
使用多个reduce任务进行处理的时候,必须使用集群才行,需要将文件打成jar包。
job.setNumReduceTasks(3); //设置同时3个reduce
分区后的reduce,默认只是依次使用3个reduce。
job.setNumReduceTasks(1); //设置1个reduce
job.setPartitionerClass(HashPartitioner.class); //设置分片方法
partitioner类就是为了确定Map处理后的文件需要使用哪个Reduce进行处理,默认使用HashPartitioner,对其所对应的键进行哈希操作,用来决定该记录使用哪个分区进行处理。
eg.自定义HashPartitioner类
class MyPartitioner extends Partitioner{
@Override
public int getPartition(Object key, Object value, int numPartitioners){
if(values.toString().startsWith("GoodWord"))
return 1;
if(values.toString().startsWith("hello"))
return 2;
else return 0;
}
}
对输入的值进行处理,根据输入的不同,返回不同的分类。
以“GoodWord”开头的全部用reduce1处理,
以“hello”开头的全部用reduce2处理,
else全部用reduce0处理。