我正在开发一个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所以我没有这个问题?我宁愿不必分配额外的内存作为权宜之计。
答案 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;
}
}
在您的工作结果中,您将看到有多少映射器具有无效的键值对。
祝你好运:)