Я работаю над проектом mapreduce, где я не могу заранее гарантировать, что моему картографу всегда будет предоставлена полезная пара ключевых значений. Я попытался окружить соответствующий код с помощью блока catch try
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, поэтому у меня нет этой проблемы? Я бы предпочел не выделять дополнительную память в качестве остановки.
Я считаю, что трассировка стека стека бесполезна, я использую этот код:
// 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;
}
}
В результатах вашей работы вы увидите, сколько у mappers неверной пары значений ключа.
Удачи :)