Hadoop Mapper填充MapOutputBuffer对象,有没有更好的方法来跳过坏键?

时间:2014-08-08 20:19:57

标签: java hadoop mapreduce

我正在开发一个mapreduce项目,我无法事先保证我的mapper总是会被赋予一个可用的keyvalue对。我尝试使用try catch块来包围相关代码,如此

public void map(LongWritable Key, Text values, Context context)
                throws IOException, InterruptedException {

            try {
                    //Attempt process

                    context.write(HKey, HValue);

                }
            } catch (Exception e) {
                //was given invalid value, drop it and move on
                context.nextKeyValue();
                e.printStackTrace();
            }
}

对大型数据集进行内存分析后发现,MapOutputBuffers占用了大部分内存,最终导致内存不足错误。有没有更好的方法来构建我的Mapper所以我没有这个问题?我宁愿不必分配额外的内存作为权宜之计。

1 个答案:

答案 0 :(得分:0)

我认为打印堆栈跟踪没用,我正在使用此代码:

// Define enumeration    
    public static enum LOCAL_COUNTER_MAP {
                INVALID 
            }   


        public void map(LongWritable Key, Text values, Context context)
                            throws IOException, InterruptedException {

                        try {
                                //Attempt process

                                context.write(HKey, HValue);

                            }
                        } catch (Exception e) {
                        // ignore value
                          context.getCounter(LOCAL_COUNTER_MAP.INVALID).increment(1);
                          return;
                        }
            }

在您的工作结果中,您将看到有多少映射器具有无效的键值对。

祝你好运:)