Shuffle过程与机制

概述:Map方法之后,Reduce方法之前的数据处理过程被称为Shuffle。
Shuffle过程:

1.Partition 分区 
2.Sort 分组
	MapSort
	GroupSort
3.Combiner Map合并

过程图解:
在这里插入图片描述
Shuffle是MR处理流程中的一个过程,步骤分散在map和reduce节点上。整体上分为三个操作:
1.分区partition为map Task阶段。
2.sort根据key Task排序,为reduce阶段。
3.最后Combiner进行局部value的合并。
Partition分区:
1.默认Partitioner分区:

public class HashPartitioner<K,V> extends Partitioner<K,V>{
	public int getParttion(K key,V value, int numReduceTasks){
		return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
	}
}

默认分区是根据key的hashCode对Reduce Tasks个数取模得到的。用户不能控制key存放在指定分区。
2.自定义Partitioner步骤
1)自定义继承Partitioner,重写getPartition()方法

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

2)在Job驱动中,设置自定义Paririoner

job.setPartitionerClass(CustomPartitioner.class);

c.自定义Partition后,要根据自定义Partition的逻辑设置相应数量的Reduce Task

job.setNumReduceTasjs(3);

3.分区总结

1)如果ReduceTask的数量大于getPartition的结果数,则会产生几个空的输出文件。
2)如果1getPartition的结果数大于ReduceTask的数量大于1,则有一部分分区数据无处安放,会报错。
3)如果ReduceTask的数量等于一,则不管MapTask端输出多少个分区文件,最终结果都会交给这一个ReduceTask,最终也就只会只产生一个结果文件。
4)分区号必须从零开始,逐一累加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值