#java #hadoop #mapreduce
#java #hadoop #mapreduce
Вопрос:
У меня есть некоторый класс map внутри класса job, и мне иногда нужно прерывать выполнение текущей задачи (платформа Hadoop Map-Reduce порождает одну задачу map для каждого 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....
Ответ №1:
Вы можете довольно легко отключить ее, переопределив 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
}
}
Таким образом, задача напрямую переходит к завершению, если ваш предикат сообщает об этом. Который все еще имеет некоторые накладные расходы, но это проще, чем изменять формат ввода.
Ответ №2:
Вы не можете прервать выполнение в методе установки.
Однако, если ваша логика для того, чтобы не запускать mapper при определенном разделении, основана на разделении no. тогда вы сможете использовать пользовательский формат ввода и средство чтения записей, чтобы пропустить определенные записи / разделения ввода.