1. 分区
1.1 自定义分区器
1) 自定义分区器继承 Partitioner类,并重写getPartition方法
2) 在driver类中设置使用
job.setPartitionerClass(PhoneNumPartitioner.class);
3) 设置reduce的个数
正常情况下,根据分区器业务来决定设置多少个,说白了就是分区器的逻辑会生成多少个分区,
则设置的多少个reduce
1.2 分区使用的注意事项:
1). reduce个数的设置
如果不设置,reduce的个数默认为1 , 则最终的分区号是固定的 0
如果 1 < reduce个数 < 分区数, 报错
如果 reduce个数 > 分区数, 不报错, 多出的reduce空跑一趟.
最佳: reduce的个数就设置为实际的分区数.
2). 分区号只能从0开始,逐一累加
2. 排序
2.1 排序是MR中最重要的操作之一 。
在MapTask中有两次排序 溢写前排序 归并排序
在ReduceTask中有1次排序 归并排序
2.2 在MR中,排序是默认的行为. 默认会对KV中的K进行排序.
默认采用字典序进行排序.
2.3 排序的分类:
1) 全排序 所有的数据整体排序,要求只能有一个分区,一个reduce.
2) 区内排序 每个分区内的数据整体排序.
3) 辅助排序(分组排序)
4) 二次排序 比较规则中用到两个条件
2.4 排序的前提:
排序的前提就是能够进行比较,
Java中的比较接口和比较器:
Comparable: 比较接口, compareTo()
Compartor : 比较器 , compare()
2.5 Hadoop排序时 如何比较的
例如:
在MapTask中的 MapOutputBuffer 类中的init方法中
comparator = job.getOutputKeyComparator(); // 获取key的比较器对象
public RawComparator getOutputKeyComparator() {
Class<? ex