1. 自定义分区步骤
- 继承partitioner,重写getPartition()方法
2. 在job驱动中,设置自定义partitioner
job.setPartitionerClass(MyPartitioner.class);
- 自定义partitioner之后,需要设置响应数量ReduceTask
job.setNumReduceTasks(5);
2. 分区总结
3. WritableComparable排序
MapTask和ReduceTask,均会对key进行排序,这是Hadoop的默认行为,任何应用程序都会排序,不管应用是否需要。且默认都是对key按照字典顺序排序,实现方式是快排序。
排序概述:
排序分类
全排序
- 设置只有一个Reduce
- 自定义排序方法,key和value调换位置,
4. combiner
5. 自定义combiner
- 继承Reducer,实现reduce方法
public class WordcountCombiner extends Reducer<Text, IntWritable, Text,IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
// 1 汇总操作
int count = 0;
for(IntWritable v :values){
count += v.get();
}
// 2 写出
context.write(key, new IntWritable(count));
}
}
- job设置驱动类
job.setCombinerClass(WordcountCombiner.class);