【大数据之Hadoop】十二、MapReduce之Partition分区

Partition分区用于将结果按条件输出到不同文件或者分区中。(分区是在mapper后reduce前)
默认分区
【大数据之Hadoop】十二、MapReduce之Partition分区_第1张图片
用户不能通过默认分区控制key存储到哪个分区。

自定义分区
步骤:
(1)自定义类继承Partitioner,重写getPartition()方法。

public class CustomPartitioner extends Partitioner<Text,FlowBean>
{
    @Override
    public int getPartition(Text key, FlowBean value, int numPartitions)
    {
        //控制分区代码逻辑
        ...
        return partition;            
    }
}

(2)在job驱动中设置自定义Partitioner。

job.setPartitionerClass(CustomPartitioner.class);

(3)自定义Partition后,根据自定义的逻辑设置相应数量的ReduceTask。不设置时默认为1,则使用默认分区。

job.setNumReduceTask(5);

总结

(1)如果ReduceTask的数量 > getPartition的结果数,则会多产生几个空文件。

(2)如果 1 < ReduceTask的数量 < getPartition的结果数,则有部分分区数据无处存储,会抛出IO异常。

(3)如果ReduceTask的数量==1,则不管MapTask端输出多少分区文件,最终结果都交给一个 ReduceTask,即使用默认分区,只产生一个结果文件。

(4)分区号必须从0开始,逐一增加。

你可能感兴趣的:(hadoop,hadoop,大数据,mapreduce)