版权声明:原创不易,转载请标明出处谢谢。 https://blog.csdn.net/shaock2018/article/details/88734902
教程目录
0x00 教程内容
- 本教程是在“MapReduce入门例子之单词计数”上做的升级,请查阅此教程。
- 包括了实现Combiner与Partitioner编程,都是一些编程技巧。
0x01 Combiner讲解
1. 优势
a. 其实就是本地的reducer,在本地先聚合一次
b. 可以减少Map Tasks输出的数据量以及数据网络的传输量
2. 使用场景
a. 适用于求和、次数等的加载
b. 求平均数等的计算并不合适
0x02 Partitioner讲解
1. 意义
a. 决定MapTask输出的数据交由哪个ReduceTask处理
b. 默认:计算分发的key的hash值对Reduce Task的个数取模决定有哪个处理
0x03 编程实操
1. 实现Combiner
a. 逻辑上与reduce是一样的,因为其实就是本地聚合,在mian方法里添加此句即可:
job.setCombinerClass(MyReducer.class);
b. 打包执行与之前的类似,可以在执行界面上可看到字眼:
2. 自定义Partitioner
a. 准备统计的数据:
student 1500
teacher 200
student 2000
teacher 300
student 2000
teacher 300
doctor 100
doctor 200
artist 55
b. 修改MyMapper类里面的map方法代码:
for(String word : words) {
context.write(new Text(word), one);
}
修改成:
context.write(new Text(words[0]), new LongWritable(Long.parseLong(words[1])));
c. 添加一个Partitioner类:
public static class MyPartitioner extends Partitioner<Text, LongWritable> {
@Override
public int getPartition(Text key, LongWritable value, int numPartitions) {
if(key.toString().equals("student")) {
return 0;
}
if(key.toString().equals("teacher")) {
return 1;
}
if(key.toString().equals("doctor")) {
return 2;
}
return 3;
}
}
d. 在main方法里添加上自定义的Partitioner类以及Reducer的个数:
//设置job的partition
job.setPartitionerClass(MyPartitioner.class);
//设置4个reducer
job.setNumReduceTasks(4);
0xFF 总结
- 注意reducer个数要与你文件的类型个数一致,如student、teacher、doctor、artist四种,则设置为4
- 如何执行请查看前面的教程。
作者简介:邵奈一
大学大数据讲师、大学市场洞察者、专栏编辑
公众号、微博、CSDN:邵奈一
复制粘贴玩转大数据系列专栏已经更新完成,请跳转学习!