У меня есть класс карты внутри класса задания, и мне иногда приходится прерывать выполнение текущей задачи (структура Hadoop Map-Reduce создает одну задачу карты для каждого InputSplit, сгенерированного InputFormat для задания):
public static class TestJobMapper
extends Mapper<LongWritable, Text, Text, Text> {
@Override
protected void setup(Context context) throws IOException, InterruptedException {
super.setup(context);
// here I want to check some predicate, and may be break execution of task
// http://hadoop.apache.org/docs/r2.3.0/api/org/apache/hadoop/mapreduce/Mapper.html
}
// continue....
Вы можете легко разбить его, переопределив метод run()
.
В нормальном коде это выполняется следующим образом:
setup(context);
try {
while (context.nextKeyValue())
map(context.getCurrentKey(), context.getCurrentValue(), context);
} finally {
cleanup(context);
}
Что вы можете сделать, так это настроить свою настройку:
@Override
public void run(Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
if(Predicate.runMapper(context)) {
super.run(context); // do the usual setup/map/cleanup cycle
}
}
Таким образом, задача сразу переходит в завершение, если ваш предикат говорит об этом. Который все еще имеет некоторые накладные расходы, но это проще, чем изменить формат ввода.
Вы не можете разорвать выполнение при методе установки.
Однако, если вы логически не выполняете сборщик на определенном расщеплении, основан на разделителе нет. то вы можете использовать пользовательский InputFormat и записывающий считыватель для пропуска определенных разделов записи/ввода.