MapReduce的默认分区是hash分区,就是key的哈希值。默认分区根据key的hashCode对ReduceTask个数取模得到。
自定义分区步骤:
- 自定义类继承Partitioner,重写getPartition()方法
- 在Job驱动中设置自定义Partitioner
job.setPartitionerClass(CustomPartitioner.class) - 自定义Partititon后,要根据自定义Partitioner的逻辑设置相应数量的ReduceTask
job.setNumReduceTasks(5)
分区总结:
- 如果reduceTask的数量 > getPartition的结果数,则会多产生几个空的输出文件part-r-000xx;
- 如果1 < ReduceTask的数量 < getPartition的结果数,则有一部分分区数据无处安放,会Exception;
- 如果ReduceTask的数量 = 1,则不管MapTask端输出多少分区文件,最终结果都会交给一个ReduceTask,最终也就只会产生一个结果文件part-r-0000;
- 分区好必须从0开始。
案例分析: