Hadoop执行多个reduce

在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处理。

你可能感兴趣的:(Hadoop执行多个reduce)