mr的shuffle

shuffle阶段主要包括map阶段的combine(压缩),group, sort, partition 以及reducer阶段的合并排序。

map阶段通过shuffle后会将输出数据按照reduce的分区文件进行保存,文件内容是按照定义的sort进行排序好的。Map阶段完成后会通知ApplicationMaster。

然后AM会通知reduce进行数据的拉取,在拉取过程中进行reduce端的shuffle过程。


用户自定义combiner:

combiner可以减少Map阶段的中间输出结果数,降低网络开销。默认情况下是没有combiner的。用户自定义的combiner要求是reducer的子类,以map的输出<key, value> 作为combiner的输入<key, value> 和输出 <key, value> 也就是说combiner的输入和输出必须是一样的。

可以通过job.setCombinerClass设置combiner的处理类,Mapreduce框架不保证一定会调用该类的方法。


用户自定义Partitioner:

Partitioner是用于确定map输出的<key, value>对应的处理reducer是哪个节点。默认MapReduce任务reduce个数是1个,此时Partitioner其实没有什么效果,但是当我们将reduce个数修改为多个的时候,partitioner就会决定key所对应的reduce的节点序号(从0开始)。可以通过job.setPartitionerClass方法指定Partitioner类,默认情况下使用hashpartitioner(默认调用key的hashcode方法)

public abstract int getPartition(KEY key, VALUE value, int numPartition);


用户自定义Group

GroupingComparator是用于将map输出的<key, value>进行分组组合成<key, List<value>>的关键类,直白讲就是用于确定key1和key2是否属于同一组,如果是同一组,就将map的输出value进行组合。

要求我们自定义的类实现接口RawComparator,可以通过job.setGroupingComparatorClass方法指定比较类。默认情况下使用WritableComparator,但是最终调用key的compareTo方法进行比较。


用户自定义sort

sortComparator是用于将map输出的<key, value>进行key排序的关键类, 直白来讲就是用于确定Key1所属组和key2所属组哪个在前哪个在后。

要求我们自定义的类实现接口RawComparator,可以通过job.setSortComparatorClass方法指定比较类。默认情况下使用writableComparator,但是最终调用key的compareTo方法进行比较。


用户自定义Reducer的shuffle

在reduce端拉取map的输出数据的时候,会进行shuffle(合并排序),mapreduce框架以插件模式提供了一个自定义的方式。我们可以通过实现接口ShuffleConsumerPlugin,并制定参数mapreduce.job.reduce.shuffle.consumer.plugin.class来指定自定义的shuffle规则,但是一般情况下,直接采用默认的类

org.apache.hadoop.mapreduce.task.reduce.shuffle。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值