Hadoop学习笔记之Partitioner分区

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

什么叫数据倾斜:

数据倾斜就是我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢。

参考资料
Hadoop学习笔记—9.Partitioner与自定义Partitioner

猜你喜欢

转载自blog.csdn.net/diyangxia/article/details/79390840
今日推荐