我的mapper类中的Hadoop NullPointerException

时间:2014-08-11 02:44:59

标签: hadoop nullpointerexception mapreduce

请帮助:

在我的mapper类中,我有实例变量protected transient HashMap<String, Double> _map = null;

我在setup(Context context)方法中初始化了此变量,同时_map填充了从SequenceFile读入的数据。

设置方法:

@Override
    protected void setup(Context context) throws IOException, InterruptedException 
    {       
        super.setup(context);

        Configuration conf = context.getConfiguration();

        _map = new HashMap<String, Double>();

        Path seqFilePath = new Path(conf.get("in"));
        Reader reader;

        try 
        {
            reader = new Reader(conf, Reader.file(seqFilePath));
            Text key = new Text();
            DoubleWritable value = new DoubleWritable();
            while (reader.next(key, value)) 
            {
                _map.put(key.toString().trim(), value.get());
            }
        }
        catch (IOException e) 
        {
            LOGGER.error("Can't find the input path to read: " + seqFilePath, e);
        }
    }

map()方法:

@Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
    {
        ...
        getDiscretizationLabel(...);
        ...
    }

在我的getDiscretizationLabel(...)方法中,我尝试从_map变量中检索数据,但NullPointerException正在抛出:

private void getDiscretizationLabel(String attribute, String value, String category, int bin, Context context) throws IOException, InterruptedException 
    {
        ...
        min = _map.get(attribute + "_min"); // throws NullPointerException
        max = _map.get(attribute + "_max");

        ...

    }

getDiscretizationLabel(...)抛出NullPointerException,到目前为止,我无法弄清楚为什么会这样,并在此处被屏蔽。

有没有办法解决这个问题或解决方法?谢谢!

1 个答案:

答案 0 :(得分:2)

我的猜测是文件未正确加载/找到。顺便说一句,我会使用一个计数器(group =“error”,name =“IOException”)来计算在setup()方法中抛出IOException的次数。在柜台报告中很容易看到计数:

context.getCounter("error","IOException").increment(1); 

如果您确定没有抛出错误,请在try-catch块之前向记录器写入错误。使用严重性错误,以便确认您可以找到记录的错误消息。