Как я могу отключить спекулятивное выполнение Hadoop из Java
После прочтения спекулятивного выполнения задачи Hadoop я пытаюсь отключить спекулятивное выполнение, используя новый API Java, но это не имеет никакого эффекта.
Это мой основной класс:
public class Main {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
//old api:
//conf.setBoolean("mapred.map.tasks.speculative.execution", false);
//new api:
conf.setBoolean("mapreduce.map.speculative", false);
int res = ToolRunner.run(conf, new LogParserMapReduce(), args);
System.exit(res);
}
}
И мой MapReducer начинается так:
@Override
public int run(String[] args) throws Exception {
Configuration conf = super.getConf();
/*
* Instantiate a Job object for your job's configuration.
*/
Job job = Job.getInstance(conf);
Но когда я смотрю на логи, я вижу:
2014-04-24 10:06:21,418 INFO org.apache.hadoop.mapreduce.lib.input.FileInputFormat (main): Total input paths to process : 16
2014-04-24 10:06:21,574 INFO org.apache.hadoop.mapreduce.JobSubmitter (main): number of splits:26
Если я понимаю, это означает, что спекулятивное выполнение все еще включено, иначе зачем было бы 26 разбиений, если бы у меня было только 16 входных файлов. Я ошибаюсь?
Примечание: я полагаю, что я использую новый API, поскольку я вижу эти предупреждения в журнале:
2014-04-24 10:06:21,590 INFO org.apache.hadoop.conf.Configuration.deprecation (main): mapred.job.classpath.files is deprecated. Instead, use mapreduce.job.classpath.files
2 ответа
"16 file = 16 Mappers" - неверное предположение.
"16 файлов = минимум 16 картографов" Это правильно.
Если некоторые из 16 файлов больше, чем размер блока, они разделяются на несколько картографических карт. Следовательно, ваши 16 файлов, генерирующие 26 картографов, могут не быть из-за спекулятивного выполнения
Установка значения в Conf, безусловно, работает. Вы можете проверить, проверив ваш job.xml
Ваша настройка "нет спекулятивного выполнения для задач карты" в порядке. Другой способ установить время выполнения (что облегчает экспериментирование / тестирование) - передать соответствующий аргумент (-ы) в командной строке. Так, например, ниже спекулятивное выполнение для карт, для которых установлено значение off, но включено для редукторов:
bin/hadoop jar -Dmapreduce.map.speculative=false \
-Dmapreduce.reduce.speculative=true <jar>