zoukankan      html  css  js  c++  java
  • 对hadoop 执行mapreduce时发生异常Illegal partition for的解决过程

    来自:http://blog.csdn.net/hezuoxiang/article/details/6878026

    写了个mapreduce的JAVA程序,自定义了个partition

    class indexPartition extends HashPartitioner<Text, Text>
    {
     public int getPartition(Text key, Text value,int numReduceTasks)
     {
      Text tmp = new Text(key.toString().substring(0,key.toString().indexOf(":")));
      super.getPartition(tmp, value, numReduceTasks);

      return numReduceTasks;
      
     }
    }

     

    在运行时出现异常:java.io.IOException:Illegal partition for my:test1 (1)

     

    第一步,找源码找原因

    (1)按出现异常的提示:

    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:904)

    at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:541)

    找到源代码的MapTask.java文件,再找到NewOutputCollector.write方法,里面有一句:

    collector.collect(key, value,partitioner.getPartition(key, value, partitions));

    这里调用了getPartition方法的返回值作为参数

    (2)在该文件查找出错的字串“Illegal partition for”,结果找一这一行:

    if (partition < 0 || partition >= partitions)

     {
              throw new IOException("Illegal partition for " + key + " (" + partition + ")");
     }

    这是collect函数的一部分,partitions是函数传入的参数,也就是刚才看到的partitioner.getPartition(key, value, partitions)的返回结果

    这时结合输出可知,当前的partition 为1,就是说partitions应该小于或等1才会出现异常了。

    (3)对比一下我自己写的partitioner,问题找到了。我是直接把传入来的参数numReduceTasks返回,我是应该把父函数的返回值返回对

    第二步,修改

    class indexPartition extends HashPartitioner<Text, Text>
    {
     public int getPartition(Text key, Text value,int numReduceTasks)
     {
      Text tmp = new Text(key.toString().substring(0,key.toString().indexOf(":")));
      int partitions = super.getPartition(tmp, value, numReduceTasks);
      return partitions;
      
     }
    }

  • 相关阅读:
    添加linux alias
    vs2019 switch语句快捷键列出枚举 及常用快捷键
    generic 泛型使用
    华为云 安装centos8.2
    linux 安装redis,mysql,netcore
    react按需加载
    工具类注册基本写法
    vue项目使用深拷贝
    react+less+antd 复习搭建(一)
    python 1 cmd进入工作
  • 原文地址:https://www.cnblogs.com/sunxucool/p/3326115.html
Copyright © 2011-2022 走看看