MapReduce实现指定分区Partitioner
一、 用途
Partition就是对map输出的key进行分组,不同的组可以指定不同的reducetask处理。相同的key一定在同一个组中。
Partition功能由partitioner的实现子类来实现。
二、 需求
不同省份流量数据汇总。
三、 简化分析
四、 创建项目
五、 编写Mapper、Reducer和自定义实体类FlowBean
Mapper:
FlowBean:
Reducer:
六、 自定义分区partitioner
1. 自定义partitionner集成Partitioner类
2. 自定义一个map集合。用于存储电话号码对应归属地
类似一个数据库表。
3. 自定义一个静态代码块。
作用:类似做一个初始化之前的查询,电话号码的归属地。
4. 完成业务代码
七、 编写Runner
1.设置 自定义的分组逻辑定义
job.setPartitionerClass(ProvinceFlowCountPartitioner.class);
2.设置reduce的任务并发数,跟分组的数量保持一致
job.setNumReduceTasks(6);
3.代码:
package com.simon.hadoop;
importorg.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public classProvinceFlowCountRunner {
public static voidmain(String[] args) throws Exception {
if(args.length < 2){
System.err.print("应该输入:input路径和output两个参数。");
System.exit(2);
}
Job job = Job.getInstance(newConfiguration());
job.setJarByClass(ProvinceFlowCountRunner.class);
job.setMapperClass(ProvinceFlowCountMapper.class);
job.setReducerClass(ProvinceFlowCountReducer.class);
//设置自定义的分组逻辑定义
job.setPartitionerClass(ProvinceFlowCountPartitioner.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(FlowBean.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(FlowBean.class);
//设置reduce的任务并发数,应该跟分组的数量保持一致
job.setNumReduceTasks(6);
FileInputFormat.setInputPaths(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
boolean b =job.waitForCompletion(true);
///正常执行成功返回0,否则返回1
if (b) {
System.exit(0);
}else {
System.exit(1);
}
}
}
4.截图
八、 打包
九、 上传
十、 运行
十一、 查看运行结果