hadoop中分区详解

分区的目的
把不同数据输出到不同reduceTask 最终到输出不同文件中

分区概念
数据的分发到不同reducer /不同文件
就是数据发送到多个目的地规则

hadoop 的默认分区原则
默认规则是: hashpartitioner
按照key的hashCode % reduceTask 数量 = 分区号
默认reduceTask 数量为1,当然也可以在driver 端进行设置
以下是Partition 类中源码
在这里插入图片描述
hadoop 的分区作用位置
mapTask 输出先到收集器,收集器数据写入环形缓冲区前先进行分区
在这里插入图片描述
自定义partitioner实现

分区号是从0开始的,自定义的时候返回分区号码也必须是从0开始的
在这里插入图片描述

public class ProvincePartitioner extends Partitioner<Text, FlowBean> {

	@Override
	public int getPartition(Text key, FlowBean value, int numPartitions) {

		// 1 获取电话号码的前三位
		String preNum = key.toString().substring(0, 3);
		
		int partition = 4;
		
		// 2 判断是哪个省
		if ("136".equals(preNum)) {
			partition = 0;
		}else if ("137".equals(preNum)) {
			partition = 1;
		}else if ("138".equals(preNum)) {
			partition = 2;
		}else if ("139".equals(preNum)) {
			partition = 3;
		}

		return partition;
	}
}

注意事项
要把不同的分区输出不同文件还要设置reduceTask 数量和分区数量一致才能达到效果
如果reduceTask 数量=1, 分区数!=1, 分区过程是不执行的,
因为底层代码,先判断reducetask !=1 才开始分区


版权声明:本文为weixin_43548518原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。