partitioner意为分区,在hadoop中,这个阶段在map之后,reduce之前
具体实现共两步:
1、设置分区类
job.setPartitionerClass(MyPartitioner.class);
自定义partitioner类,MyPartitioner,分区的依据,默认为HashPartitioner,如果不加这设置,仅有下面的setNumReduceTasks,那么也会有多个reduce,但是最后产生的文件内容是随机存放的
public static class MyPartitioner extends Partitioner<Text,Text> {
@Override
public int getPartition(Text key, Text value, int numPartitions) {
int keyInt = Integer.parseInt(key.toString());
if(keyInt > 5){
return 3;
}else if(keyInt > 3 && keyInt <=5){
return 2;
}else if(keyInt > 1 && keyInt <= 3){
return 1;
}else {
return 0;
}
}
}
2、设置作业的reduce个数
job.setNumReduceTasks(6);
默认为1,注意:这个值要大于等于自定义partitioner中的返回个数,如果小于的话,就会报如下错误
Error: java.io.IOException: Illegal partition for 4 (2)
通过以上两步就会在最后结果中生成多个文件part-r-0001,part-r-0002……
另外使用多个reduce也可以提升作业运行效率,对于生成的多个结果文件可以使用cat命令合并到一个文件中
hdfs dfs -cat /user/xxx/output/20180119_chuxing/* >> 20180119_chuxing.txt
什么叫数据倾斜:
数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。