Java Hadoop Mapper填充MapOutputBuffer对象,有没有更好的方法跳过坏键?
我正在从事一个mapreduce项目,在这个项目中,我无法事先保证我的映射器将始终获得一个可用的键值对。我试着用一个try-catch块来包围相关代码,就像这样Java Hadoop Mapper填充MapOutputBuffer对象,有没有更好的方法跳过坏键?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在从事一个mapreduce项目,在这个项目中,我无法事先保证我的映射器将始终获得一个可用的键值对。我试着用一个try-catch块来包围相关代码,就像这样 public void map(LongWritable Key, Text values, Context context) throws IOException, InterruptedException { try { //Attem
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占用了我的大部分内存,最终导致内存不足错误。有没有更好的方法来构造我的映射器,这样我就不会有这个问题?我不想分配额外的内存作为权宜之计。我认为打印堆栈跟踪是无用的,我使用以下代码:
// 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;
}
}
在作业结果中,您将看到有多少映射程序具有无效的键值对
祝你好运:)打印堆栈跟踪并不是真正的问题,尽管这是一个很好的解决方法。我要做的是阻止我的日志文件膨胀。无论如何,问题是,即使我使用return语句跳过了错误的值,我也遇到了gc开销限制。好吧,问题是进程在垃圾收集中花费了98%以上的时间,而堆的不到2%被恢复。所以试着增加堆的大小,看看这篇文章,认为它能帮上忙——现在它似乎正在工作,这很奇怪,我想我在hadoop环境文件中设置了它。我确实想知道是否还有一些其他的内存问题我可以解决,但现在这已经足够了。非常感谢。