【大数据之Hadoop】十二、MapReduce之Partition分区
(3)如果ReduceTask的数量==1,则不管MapTask端输出多少分区文件,最终结果都交给一个 ReduceTask,即使用默认分区,只产生一个结果文件。(2)如果 1 < ReduceTask的数量 < getPartition的结果数,则有部分分区数据无处存储,会抛出IO异常。(3)自定义Partition后,根据自定义的逻辑设置相应数量的ReduceTask。不设置时默认为1,则使用
Partition分区用于将结果按条件输出到不同文件或者分区中。(分区是在mapper后reduce前)
默认分区
用户不能通过默认分区控制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开始,逐一增加。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)