在MapReduce中如果不设置ReduceTask个数时,默认为1;如果我们使用了自定义分区,那么同时也需要在主类中设置ReduceTask个数,此时要注意分区个数与ReduceTask个数之间的不同组合会产生以下不同结果:
- 当ReduceTask个数(n)>分区个数(m),会产生m个实际输出文件和(n-m)个空白输出文件。
- 当1<ReduceTask个数(n)<分区个数(m),导致部分区分在写出文件时不知道要放到哪个ReduceTask对应的结果中去,因为分区个数超过了ReduceTask个数。此时会抛异常:IO异常。
- 当ReduceTask个数(n)=1时,无论分区个数为几,所有分区结果全部放在同一个输出文件中。
- 在自定义分区中定义分区编号时,要特别注意,分区编号必须从1开始,并且步长为1。