MapReduce中的 分区,分组,排序(区别)

2020-7-26

一. Partition分区:

功能:

按照条件将结果输入到不同的文件中

实现步骤:

自定义排序规则继承Partitioner类,重写getPartition()方法

在job驱动Driver中设置自定义排序规则

在Driver中根据分区数,设置ReduceTask数

分区数和ReduceTask关系

如果ReduceTask的数量(分区数)大于getPartition设置的数量,会产生空的输出文件

如果ReduceTask的数量大于1,getPartition又大于ReduceTask的数量,就会出现无处安放的数据,会抛出异常

如果ReduceTask的数量等于1,不管你设置了多少个分区,最后输出都会输出到一个文件里part-r-00000000

分区号必须是从0开始。例如:设置4个分区,则输出文件为编号为0,1,2,3。getPartition里面的分区指定也要符合这个规则

二. Group分组:

功能

发生在Reduce之前,增加reduce的并行度

实现步骤:

写一个分组类,继承WritableComparator类

重写构造方法

重写compare(WritableComparable a,
WritableComparable b)方法

Driver指定分组器setGroupingComparatorClass

意义:

合理使用,按照特定规则进行归纳,增加reduce
任务并行度,防止Reduce端数据倾斜

三. Compare排序:

功能:

MapReduce的排序主要是指的将Map输出的key进行排序

但是整个Shuffle中会用到四次排序,都会按照指定的排序规则排序

实现步骤

MapReduce提供的数据类型均已实现WritableComparable接口。

直接在对象中实现WritableComparable接口,重写write(),readFields(),compareTo(),三个方法。在compareTo方法里定义排序规则。

写一个排序比较器,继承WritableComparable,重写构造方法和compare方法。

在Driver中设置排序比较器器。
setSortComparatorClass(class);

注意

MapTask和ReduceTask均会对数据按照Key进行排序,该操作属于MR默认行为。

任何应用程序中的数据均会被排序,不论是否需要。MapTask输出的key必须实现writablecomparable接口,实现compareTo方法。即使指定排序规则,若key对象没有comperTo方法仍会抛出异常(指定的规则最终仍会调用key的compareTo)。所以MapTask输出的key无论如何必须实现WC接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值