Все наоборот. Количество мапперов определяется на основе количества сплитов. На самом деле это работа 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