Установка количества задач карты и сокращение задач - PullRequest
35 голосов
/ 30 июля 2011

В настоящее время я выполняю задание. Я установил число задач карты на 20, но получаю большее число. Я также установил задачу уменьшения на ноль, но я все еще получаю число, отличное от нуля. Общее время выполнения задания MapReduce также не отображается. Может кто-нибудь сказать мне, что я делаю не так. Я использую эту команду

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0

Выход:

11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164
11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18
11/07/30 19:48:56 INFO mapred.JobClient:   Job Counters 
11/07/30 19:48:56 INFO mapred.JobClient:     Launched reduce tasks=13
11/07/30 19:48:56 INFO mapred.JobClient:     Rack-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:     Launched map tasks=24
11/07/30 19:48:56 INFO mapred.JobClient:     Data-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:   FileSystemCounters
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_READ=4020792636
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_READ=1556534680
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=6026699058
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:   Map-Reduce Framework
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input groups=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Combine output records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map input records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce shuffle bytes=1974162269
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Spilled Records=120000000
11/07/30 19:48:56 INFO mapred.JobClient:     Map output bytes=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:     Combine input records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input records=40000000
[hcrc1425n30]s0907855: 

Ответы [ 15 ]

58 голосов
/ 31 июля 2011

Количество задач карты для данного задания определяется количеством входных разбиений, а не параметром mapred.map.tasks.Для каждого входного разбиения порождается задача карты.Таким образом, в течение срока действия задания maprecece количество задач map равно числу входных разбиений.mapred.map.tasks - это просто подсказка InputFormat для количества карт.

В вашем примере Hadoop определил, что существует 24 входных разбиения, и в общей сложности создаст 24 задачи карты.Но вы можете контролировать, сколько задач карты может выполняться параллельно каждым из трекеров задач.

Кроме того, удаление пробела после -D может решить проблему уменьшения.

Для получения дополнительной информацииинформацию о количестве карт и сокращении заданий смотрите по нижеуказанному URL

http://wiki.apache.org/hadoop/HowManyMapsAndReduces

19 голосов
/ 06 июля 2012

Как упоминал Правин выше, при использовании базовых классов FileInputFormat это просто количество входных разбиений, которые составляют данные.Количество редукторов равно , которое контролируется mapred.reduce.tasks, указанным в том виде, в котором оно у вас есть: -D mapred.reduce.tasks=10 будет указывать 10 редукторов.Обратите внимание, что пробел после -D является обязательным ; если вы пропустите пробел, свойство конфигурации передается соответствующей JVM, а не Hadoop.

Вы указываете 0потому что нет сокращения работы?В этом случае, если у вас возникли проблемы с параметром времени выполнения, вы также можете установить значение непосредственно в коде.Учитывая JobConf экземпляр job, вызовите

job.setNumReduceTasks(0);

внутри, скажем, вашей реализации Tool.run.Это должно производить вывод непосредственно из картографов.Если ваша работа фактически не производит никакого вывода (потому что вы используете платформу только для побочных эффектов, таких как сетевые вызовы или обработка изображений, или если результаты полностью учитываются в значениях счетчика), вы можете отключить вывод, также вызвав

job.setOutputFormat(NullOutputFormat.class);
9 голосов
/ 16 апреля 2013

Важно помнить, что инфраструктура MapReduce в Hadoop позволяет нам только

предложить количество задач Map для задания

, который, как указывал Правин, будет соответствовать количеству входных разбиений для задачи.В отличие от его поведения для числа редукторов (которое напрямую связано с количеством файлов, выводимых заданием MapReduce), где мы можем

требовать , чтобы оно предоставило n редукторов.

7 голосов
/ 24 января 2014

Чтобы объяснить это на примере:

Предположим, что размер входного файла hadoop равен 2 ГБ, а размер блока равен 64 МБ, поэтому задаются 32 задачи Mappers, в то время как каждый модуль отображения обрабатывает блок размером 64 МБ взавершите задание Mapper для вашего задания Hadoop.

==> Количество заданных для работы картографов полностью зависит от 1) размера файла и 2) размера блока

Предположим, у вас запущен hadoop наразмер кластера 4: Предположим, что вы установили параметры mapred.map.tasks и mapred.reduce.tasks в файле conf для узлов следующим образом:

Node 1: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 2: mapred.map.tasks = 2 and mapred.reduce.tasks = 2
Node 3: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 4: mapred.map.tasks = 1 and mapred.reduce.tasks = 1

Предположим, вы установили вышеуказанные параметры для 4 ваших узловв этом кластере.Если вы заметили, что для Узла 2 установлены только 2 и 2 соответственно, потому что ресурсы обработки Узла 2 могут быть меньше, например (2 процессора, 2 ядра), а для Узла 4 даже установлено меньше 1 и 1, соответственно, возможно, из-за ресурсов обработкина этом узле 1 процессор, 2 ядра, поэтому не может работать более 1 задачи преобразования и 1 задачи редукции.

Таким образом, при запуске задания узел 1, узел 2, узел 3, узел 4 настраиваются для запускамакс.всего (4 + 2 + 4 + 1) 11 задач mapper одновременно из 42 задач mapper, которые должны быть выполнены заданием.После того, как каждый узел завершит свои задачи карты, он возьмет оставшиеся задачи картографа, оставшиеся в 42 задачах картографа.

Теперь перейдем к редукторам, так как вы установили mapred.reduce.tasks = 0, так что мы получаем только вывод карт в 42файлы (по 1 файлу для каждой задачи отображения) и без вывода редуктора.

2 голосов
/ 20 августа 2015

В более новой версии Hadoop есть гораздо более детализированные mapreduce.job.running.map.limit и mapreduce.job.running.reduce.limit, которые позволяют вам устанавливать число картографов и редукторов независимо от размера разделения файла hdfs.Это полезно, если вы не можете использовать большие ресурсы в кластере.

JIRA

1 голос
/ 21 февраля 2017

Количество задач на карте напрямую определяется количеством блоков, которые вы вводите. Размер фрагмента данных (то есть размер блока HDFS) является контролируемым и может быть установлен для отдельного файла, набора файлов, каталога (-s). Таким образом, установка определенного количества заданий карты в задании возможна, но включает установку соответствующего размера блока HDFS для входных данных задания. mapred.map.tasks также может быть использовано для этого, но только если его предоставленное значение больше, чем количество разбиений для входных данных задания.

Управление числом редукторов с помощью mapred.reduce.tasks является правильным. Однако установка его в ноль является довольно частным случаем: выходные данные задания представляют собой конкатенацию выходных данных картографических устройств (не отсортированных). В ответе Мэтта можно увидеть больше способов установить количество редукторов.

1 голос
/ 02 сентября 2015

В вашем примере -D детали не подобраны:

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0

Они должны следовать за частью имени класса, как это:

hadoop jar Test_Parallel_for.jar Test_Parallel_for -Dmapred.map.tasks=20 -Dmapred.reduce.tasks=0 Matrix/test4.txt Result 3

Пробел после -D разрешен, хотя.

Также обратите внимание, что изменение числа картографов, вероятно, является плохой идеей, как уже упоминали другие люди.

1 голос
/ 23 февраля 2012

Из вашего журнала я понял, что у вас 12 входных файлов, так как генерируются 12 локальных карт.Rack Локальные карты создаются для того же файла, если некоторые из блоков этого файла находятся в каком-то другом узле данных.Сколько у вас узлов данных?

0 голосов
/ 03 марта 2016

Количество задач карты зависит от размера файла. Если вам нужно n номеров карты, разделите размер файла на n следующим образом:

conf.set("mapred.max.split.size", "41943040"); // maximum split file size in bytes
conf.set("mapred.min.split.size", "20971520"); // minimum split file size in bytes
0 голосов
/ 08 апреля 2015

Первая часть уже получена, «просто предложение». Вторая часть также получена, «убрать лишние пробелы вокруг =». Если оба эти метода не сработали, вы уверены, что реализовали ToolRunner

...