Как распределяются данные в Hadoop

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

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

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

Это наоборот. Количество преобразователей определяется исходя из количества разделов. На самом деле это работа 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, и люди часто путаются этим. Блок представляет собой физическую часть данных, в то время как раскол - это всего лишь логическая часть, которая будет передана картографу. Разделение не содержит входных данных, это просто ссылка на данные. Тогда что такое раскол? У раскола в основном есть 2 вещи: a length in bytes и набор storage locations, которые являются строками только хоста.

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

НТН

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

Нет. Это не так.

Число Mappers для задания определяется Framework.

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

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

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

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

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

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

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

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

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

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