MapReduce的分区功能自我理解其实它最终的功能是为了计算出来的数据分区存储,方便日后查询更看
我们今天一个部门值来进行分区,
MapReduce分区是从Map输出的K2阶段进入到Reducer时候在聚合相同key2的时候就开始进入分区
相同的Key2我们会把它放入到一个分区中,Reducer的主要作用为了聚合相同的Key2
要想做分区我们需要写出分区规则让reduce进行分区,需要实现Partion的类型
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner;
public class EmployeePartition extends Partitioner<IntWritable, Employee>
{
@Override
public int getPartition(IntWritable k2, Employee e, int numTask) {
if (k2.equals(10))
{
return 1%numTask;//这里为了出现溢出,我们进行了取余处理,为的不我们处理逻辑中给定的数肯定不会超出numTask的值
}
if (k2.equals(20))
{
return 2%numTask;
}
if (k2.equals(30))
{
return 3%numTask;
}
return 0;
}
}
然后再在我们的job任务中添加分区规则和分区数即可,其他的代码和我们以前处理的逻辑是一样的
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class EmployeeJobMain
{
public static void main(String[] args) throws Exception {
//创建任务
Job job=Job.getInstance(new Configuration());
job.setJarByClass(EmployeeJobMain.class);
//指定map和map的输出类型\
job.setMapperClass(EmployeeMapper.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(Employee.class);
//设置分区规则
job.setPartitionerClass(EmployeePartition.class);
//设置分区数
job.setNumReduceTasks(3);
//指定reduce和reduce的输出类型,这里我们因为没有写reducer程序所以直接指定输出类型就可以了
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(Employee.class);
//指定任务的输入和输出路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//启动任务
job.waitForCompletion(true);
}
}
打印的日志,区别于一个分区的地方
这个最终3个分区的文件
注意的是:(1)一定要有reducer程序,如果没有Reducer程序不会产生分区
(2)就是在分区配置中intWritable中比较实用的是compareto,我就是因为实用equals不能产生分区内容的
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner;
public class EmployeePartition extends Partitioner<IntWritable, Employee>
{
@Override
public int getPartition(IntWritable k2, Employee e, int numTask) {
int deptno = e.getDeptno();
if (deptno==10)
{
return 1%numTask;//这里为了出现溢出,我们进行了取余处理,为的不我们处理逻辑中给定的数肯定不会超出numTask的值
}
if (deptno==20)
{
return 2%numTask;
}
if (deptno==30)
{
return 3%numTask;
}
return 0;
}
}