Как с помощью Hadoop изменить количество картографов для данного задания?

Итак, у меня есть два задания, задание A и задание B. Для задания A я хотел бы иметь максимум 6 картографов на узел. Однако работа B немного отличается. Для задания B я могу запустить только один преобразователь на узел. Причина этого не важна — скажем так, это требование не подлежит обсуждению. Я хотел бы сказать Hadoop: «Для задания A запланируйте не более 6 картографов на узел. Но для задания B запланируйте не более 1 преобразователя на узел». Это вообще возможно?

Единственное решение, о котором я могу думать, это:

1) Имейте две папки из основной папки Hadoop, conf.JobA и conf.JobB. Каждая папка имеет собственную копию файла mapred-site.xml. conf.JobA/mapred-site.xml имеет значение 6 для mapred.tasktracker.map.tasks.maximum. conf.JobB/mapred-site.xml имеет значение 1 для mapred.tasktracker.map.tasks.maximum.

2) Перед запуском задания A:

2a) Закройте мои тасктрекеры

2b) Скопируйте файл conf.JobA/mapred-site.xml в папку conf Hadoop, заменив файл mapred-site.xml, который уже был там.

2c) Перезапустите мои трекеры задач

2d) Подождите, пока тасктрекеры закончат запуск

3) Запустить задание А

а затем сделать то же самое, когда мне нужно запустить задание B.

Мне действительно не нравится это решение; это кажется неуклюжим и склонным к сбоям. Есть ли лучший способ сделать то, что мне нужно сделать?


person sangfroid    schedule 11.03.2013    source источник


Ответы (1)


В вашем коде Java для самого пользовательского jar вы можете установить эту конфигурацию mapred.tasktracker.map.tasks.maximum для обоих ваших заданий.

Сделайте что-то вроде этого:

Configuration conf = getConf();

// set number of mappers
conf.setInt("mapred.tasktracker.map.tasks.maximum", 4);

Job job = new Job(conf);

job.setJarByClass(MyMapRed.class);
job.setJobName(JOB_NAME);

job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(MapJob.class);
job.setMapOutputKeyClass(Text.class);
job.setReducerClass(ReduceJob.class);
job.setMapOutputValueClass(Text.class);
job.setOutputFormatClass(TextOutputFormat.class);

FileInputFormat.setInputPaths(job, args[0]);

boolean success = job.waitForCompletion(true);
return success ? 0 : 1;

ИЗМЕНИТЬ:

Вам также необходимо установить для свойства mapred.map.tasks значение, полученное из следующей формулы (mapred.tasktracker.map.tasks.maximum * Количество узлов Tasktracker в вашем кластере).

person Amar    schedule 12.03.2013
comment
Спасибо за вашу помощь, но это не сработало для меня вообще. Удалось ли вам запустить тестовый проект с этим и убедиться, что он использует только 4 слота картографа? Насколько я понимаю, mapred.tasktracker.map.tasks.maximum можно установить только на стороне сервера, в mapred-site.xml. Я использую Hadoop .20.2, не знаю, имеет ли это значение. - person sangfroid; 13.03.2013
comment
Я не пробовал эту конкретную конфигурацию, но многие другие конфигурации mapred-сайтов, которые мы программно устанавливали для каждого задания. Например, я успешно ограничил номер редуктора до 1, установив следующую конфигурацию на 1: mapred.reduce.tasks. Также я установил mapred.textoutputformat.separator и mapred.output.compress. Поэтому поделитесь кодом (используйте pastebin), возможно, вы что-то делаете не так. - person Amar; 13.03.2013
comment
Спасибо еще раз за помощь. Я пытался установить mapred.reduce.tasks, но это, к сожалению, не помогло. Что вы устанавливаете для двух других параметров? А вот и pastebin с моим тестовым проектом: pastebin.com/2V4UV5TQ - person sangfroid; 14.03.2013