Hadoop中的分区


在getPartition方法当中:
相同的key一定会得到相同的hashCode(),2147483647是Integer.MAX_VALUE,这是一个编程的技巧,规范。把得到的数与最大值相与,得到的数肯定为一个正值,这个时候再去对numReduceTasks取余,得到是哪个分区。取hashCode可以保证相同的key一定可以分到相同的分区里。

在运行的主类中,模板代码里,设置这个numReduceTasks,分区的个数。

        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);

        //设置ReduceTask个数为1,不写的情况下默认是1
        job.setNumReduceTasks(2);

        //设置Partition使用的是哪个类,默认的是HashPartitioner.class
        job.setPartitionerClass(ProvincePartitioner.class);

        //上边这两句要结合起来

如果默认的分区规则不满足我们的业务需求,重写分区规则。MR提供了相关的接口供我们去编写。写自己的类,实现Partitioner<K2, V2>,重点是分区的编号,即getPartition方法,返回的是int值。重写这个getPartition方法。

numReduceTasks指定是多少,就会生成多少个文件。只是多余的文件里没有内容。

6、关于reduceTask个数跟分区数的关系

reduceTask = 分区数    完美运行 
reduceTask > 分区数    完美运行 但是没有数据来到的分区 结果文件为空 浪费资源
reduceTask < 分区数    程序报错  Illegal partition 

hashCode是Object当中的方法,在字符串String类型中重写了hashCode方法

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

为什么在String中重写的hashCode方法选择了乘以31,因为31计算起来方便,
而且31是一个质数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,388评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,930评论 18 399
  • 从前,有一只鸭子,鸭子生了个蛋,原来那鸭子是个男的。。。。。。哈哈哈哈哈,好吧,那个鸭子在孵卵。
    去看看我能遇到什么好事阅读 1,202评论 0 0
  • 小编首记:“一号公路+66号公路”、自驾、洛杉矶、拉斯维加斯、金门大桥、谷歌总部、斯坦福大学、大峡谷……这些名词放...
    邪魅一笑老司机阅读 3,355评论 0 0
  • “主人。”一道低沉声音响起。 盘膝坐在银白草席上闭眼静修的时空岛主睁开眼,他知道这声音是时空神殿器灵来禀告。 “何...
    im喵小姐阅读 4,010评论 0 0