Как данные разбиваются в Hadoop

Разделяет ли Hadoop данные на основе количества картографов, установленных в программе? То есть, имея набор данных размером 500 МБ, если количество модулей сопоставления равно 200 (при условии, что кластер Hadoop допускает одновременное использование 200 модулей сопоставления), предоставляется ли каждому преобразователю 2,5 МБ данных?

Кроме того, все ли картографы работают одновременно или некоторые из них могут запускаться последовательно?


person HHH    schedule 03.07.2013    source источник


Ответы (5)


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

Вход: файл меньше размера блока.

Вариант 1: количество картографов = 1. Результат: запущена 1 задача карты. Размер inputsplit для каждого маппера (в данном случае только одного) такой же, как и размер входного файла.

Случай 2: количество картографов = 5. Результат: запущено 5 картографических задач. Размер inputsplit для каждого преобразователя составляет одну пятую от размера входного файла.

Случай 3: количество картографов = 10. Результат: запущено 10 картографических задач. Размер inputsplit для каждого картографа составляет одну десятую от размера входного файла.

Итак, исходя из вышеизложенного, для файла меньше размера блока

разделенный размер = общий размер входного файла / количество запущенных задач карты.

Примечание. Но имейте в виду, что нет. задачи карты решаются на основе разделения входных данных.

person Arijit Banerjee    schedule 04.07.2013
comment
Кроме того, все ли картографы работают одновременно или некоторые из них могут запускаться последовательно? -- Если слотов для карт достаточно, то все задачи карты будут запущены одновременно. Если у вас больше картографических задач, чем доступных слотов, дополнительные картографические задачи будут ждать завершения работы картографов. - person Arijit Banerjee; 04.07.2013
comment
Также обратите внимание, что я считал, что вы используете старые API-интерфейсы mapred, поскольку мой код основан на них. Вот сигнатура getSplits FileInputFormat, и она имеет numSplits в качестве параметра. public InputSplit[] getSplits (задание JobConf, int numSplits) - person Arijit Banerjee; 04.07.2013
comment
это наоборот - person Tagar; 31.01.2016

Все наоборот. Количество мапперов определяется на основе количества сплитов. На самом деле это работа InputFormat, которую вы используете, для создания расщеплений. Вы не имеете ни малейшего представления о количестве мапперов, пока не будет принято решение о количестве сплитов. И не всегда разделения будут создаваться на основе размера блока HDFS. Это полностью зависит от логики внутри метода getSplits() вашего InputFormat.

Чтобы лучше понять это, предположим, что вы обрабатываете данные, хранящиеся в MySQL, с помощью MR. Поскольку в этом случае нет концепции блоков, теория о том, что разбиения всегда создаются на основе блока HDFS, терпит неудачу. Верно? А как насчет создания сплитов? Одна из возможностей состоит в том, чтобы создать разделение на основе диапазонов строк в вашей таблице MySQL (именно это и делает DBInputFormat, входной формат для чтения данных из реляционной базы данных). Предположим, у вас есть 100 строк. Тогда у вас может быть 5 разделений по 20 строк в каждом.

Только для InputFormats, основанных на FileInputFormat (InputFormat для обработки данных, хранящихся в файлах), разбиения создаются на основе общего размера входных файлов в байтах. Однако размер блока FileSystem входных файлов рассматривается как верхняя граница разделения входных данных. Если у вас есть файл меньше размера блока HDFS, вы получите только 1 преобразователь для этого файла. Если вы хотите иметь другое поведение, вы можете использовать mapred.min.split.size. Но это снова зависит исключительно от getSplits() вашего InputFormat.

Существует фундаментальная разница между MR split и HDFS block, и людей это часто сбивает с толку. Блок — это физический фрагмент данных, в то время как разбиение — это просто логический фрагмент, который будет передан преобразователю. Разделение не содержит входных данных, это просто ссылка на данные. Тогда что такое раскол? Разделение в основном состоит из двух вещей: length in bytes и набора storage locations, которые являются просто строками имени хоста.

Возвращаясь к вашему вопросу. Hadoop позволяет использовать более 200 картографов. При этом не имеет особого смысла иметь 200 картографов всего лишь для 500 МБ данных. Всегда помните, что когда вы говорите о Hadoop, вы имеете дело с очень большими данными. Отправка всего 2,5 МБ данных каждому картографу была бы излишней. И да, если нет свободных слотов процессора, то некоторые мапперы могут запускаться после завершения текущих мапперов. Но фреймворк MR очень умен и старается изо всех сил избегать подобных ситуаций. Если машина, на которой находятся данные для обработки, не имеет свободных слотов ЦП, данные будут перемещены на ближайший узел, где есть свободные слоты, и будут обработаны.

ХТН

person Tariq    schedule 04.07.2013

Когда вы вводите данные в распределенную файловую систему Hadoop (HDFS), Hadoop разделяет ваши данные в зависимости от размера блока (по умолчанию 64 МБ) и распределяет блоки по кластеру. Таким образом, ваши 500 МБ будут разбиты на 8 блоков. Это не зависит от количества мапперов, это свойство HDFS.

Теперь, когда вы запускаете задание MapReduce, Hadoop по умолчанию назначает 1 сопоставитель на блок, поэтому, если у вас есть 8 блоков, Hadoop запустит 8 задач сопоставления.

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

В вашем случае, предполагая, что 500 МБ разбиты на 8 блоков, даже если вы укажете 200 картографов, не все из них будут обрабатывать данные, даже если они инициализированы.

person Chaos    schedule 03.07.2013
comment
Спасибо. Но счетчик заданий показывает, что запущено 200 мапперов! Вы хотите сказать, что это не реально? - person HHH; 04.07.2013
comment
В этом случае большинство картографов будут работать, но не будут обрабатывать данные. Я думаю, вы обнаружите это, когда проверите журналы картографа, в большинстве из них не будет входных/выходных данных. Я отредактирую свой ответ, чтобы отразить это. - person Chaos; 05.07.2013

Если 200 картографов работают для 500 МБ данных, вам необходимо проверить размер каждого отдельного файла. Если размер этого файла меньше размера блока (64 МБ), то для каждого файла будет выполняться задание сопоставления.

Обычно мы объединяем файлы меньшего размера в один большой файл (размер которого превышает размер блока).

person hjamali52    schedule 20.09.2013

Нет, это не так.

Количество картографов для задания определяется платформой.

Взгляните на Apache MapReduce ссылка на учебник.

Сколько карт?

Количество карт обычно определяется общим размером входных данных, то есть общим количеством блоков входных файлов.

Правильный уровень параллелизма для карт, по-видимому, составляет около 10-100 карт на узел, хотя он был установлен до 300 карт для задач с очень низкой нагрузкой на процессор. Настройка задачи занимает некоторое время, поэтому лучше всего, если на выполнение карт потребуется хотя бы минута.

Таким образом, если вы ожидаете 10 ТБ входных данных и имеете размер блока 128 МБ, вы получите 82 000 карт, если только Configuration.set(MRJobConfig.NUM_MAPS, int) (который только дает подсказку для платформы) раньше устанавливали его еще выше.

Возвращаясь к вашим запросам:

То есть, имея набор данных размером 500 МБ, если количество модулей сопоставления равно 200 (при условии, что кластер Hadoop допускает одновременное использование 200 модулей сопоставления), предоставляется ли каждому преобразователю 2,5 МБ данных?

Если размер блока DFS и входного разделения составляет 128 МБ, то для файла 500 МБ требуется 4 преобразователя для обработки данных. . В приведенном выше случае Framework запустит 4 задачи Mapper.

Все ли преобразователи работают одновременно или некоторые из них могут запускаться последовательно?

Все картографы работают одновременно. Но Reducer будет работать только тогда, когда выходные данные всех картографов будут скопированы и доступны для них.

person Ravindra babu    schedule 01.02.2016