Запуск отдельного приложения Hadoop на нескольких ядрах процессора - PullRequest
7 голосов
/ 04 августа 2010

Моя команда создала приложение Java с использованием библиотек Hadoop для преобразования множества входных файлов в полезный вывод. Учитывая текущую нагрузку, один многоядерный сервер будет работать хорошо в течение следующего года или около того. У нас (пока) нет необходимости использовать многосерверный кластер Hadoop, но мы решили начать этот проект «в стадии подготовки».

Когда я запускаю это приложение в командной строке (или в Eclipse или NetBeans), я еще не смог убедить его использовать более одной карты и / или уменьшить поток за раз. Учитывая тот факт, что инструмент очень сильно загружает процессор, эта «однопоточность» является моим текущим узким местом.

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

Входные данные состоят из нескольких входных файлов, поэтому Hadoop должен по крайней мере иметь возможность запускать 1 поток на каждый входной файл одновременно для фазы карты.

Что я должен сделать, чтобы хотя бы 2 или даже 4 активных потока работали (что должно быть возможно в течение большей части времени обработки этого приложения)?

Я ожидаю, что это будет что-то очень глупое, что я упустил из виду.


Я только что нашел это: https://issues.apache.org/jira/browse/MAPREDUCE-1367 Это реализует функцию, которую я искал в Hadoop 0.21 Он вводит флаг mapreduce.local.map.tasks.maximum для управления им.

Пока я также нашел решение, описанное здесь в этом вопросе .

Ответы [ 4 ]

5 голосов
/ 04 августа 2010

Я не уверен, что я прав, но когда вы выполняете задачи в локальном режиме, у вас не может быть нескольких картографов / редукторов.

В любом случае, для установки максимального количества работающих картографов иРедукторы используют параметры конфигурации mapred.tasktracker.map.tasks.maximum и mapred.tasktracker.reduce.tasks.maximum по умолчанию, эти параметры установлены на 2, поэтому я могу быть прав.полностью распределенным способом, но все серверы (namenode, datanode, tasktracker, jobtracker, ...) работают на одной машине

2 голосов
/ 09 мая 2012

Просто для пояснения ... Если hadoop запускается в локальном режиме, у вас нет параллельного выполнения на уровне задач (кроме случаев, когда вы запускаете> = hadoop 0.21 ( MAPREDUCE-1367 )).Хотя вы можете отправить несколько заданий одновременно, и они будут выполняться параллельно.

Все эти

mapred.tasktracker. {Map | redu} .tasks.maximum

*Свойства 1009 *

применяются только к hadoop, работающему в распределенном режиме!

HTH Joahnnes

0 голосов
/ 09 мая 2012

Что вы хотите сделать, это запустить Hadoop в «псевдораспределенном» режиме.Одна машина, но с запущенными трекерами и именами узлов, как если бы это был настоящий кластер.Затем он (потенциально) будет запускать несколько рабочих.

Обратите внимание, что если ваш ввод мал, Hadoop решит, что не стоит распараллеливать.Возможно, вам придется уговорить его, изменив размер разделения по умолчанию.

По моему опыту, "типичные" задания Hadoop связаны с вводом / выводом, иногда с памятью, прежде чем они будут связаны с процессором.По этой причине может оказаться невозможным полностью использовать все ядра на одном компьютере.

0 голосов
/ 04 августа 2010

Согласно этой теме в списке адресов электронной почты hadoop.core-user , вы захотите изменить настройку mapred.tasktracker.tasks.maximum на максимальное количество задач, которые вы хотели бы выполнить на вашей машине (чтоколичество ядер).

Это (и другие свойства, которые вы можете настроить) также описано в основной документации по настройке кластера / демонов .

...