Как остановить задачу карты из метода настройки?

1

У меня есть класс карты внутри класса задания, и мне иногда приходится прерывать выполнение текущей задачи (структура 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....
Теги:
hadoop
mapreduce

2 ответа

2
Лучший ответ

Вы можете легко разбить его, переопределив метод 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
   }
}

Таким образом, задача сразу переходит в завершение, если ваш предикат говорит об этом. Который все еще имеет некоторые накладные расходы, но это проще, чем изменить формат ввода.

0

Вы не можете разорвать выполнение при методе установки.

Однако, если вы логически не выполняете сборщик на определенном расщеплении, основан на разделителе нет. то вы можете использовать пользовательский InputFormat и записывающий считыватель для пропуска определенных разделов записи/ввода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню