Как остановить задачу map из метода setup?

#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. тогда вы сможете использовать пользовательский формат ввода и средство чтения записей, чтобы пропустить определенные записи / разделения ввода.