Поведение параметра "mapred.min.split.size" в HDFS
Параметр "mapred.min.split.size" изменяет размер блока, в который файл был записан ранее? Предполагая ситуацию, когда я при запуске своей JOB передаю параметр "mapred.min.split.size" со значением 134217728 (128 МБ). Что правильно сказать о том, что происходит?
1 - каждый MAP обрабатывает эквивалент 2 блоков HDFS (при условии, что каждый блок 64 МБ);
2 - будет новый раздел моего входного файла (ранее включал HDFS), чтобы занимать блоки в HDFS 128M;
3 ответа
Размер сплита рассчитывается по формуле:
max(mapred.min.split.size, min(mapred.max.split.size, dfs.block.size))
В вашем случае это будет:-
split size=max(128,min(Long.MAX_VALUE(default),64))
Итак, выше вывод:-
каждая карта будет обрабатывать 2 блока hdfs(при условии, что каждый блок 64 МБ): True
Будет новое разделение моего входного файла (ранее HDFS) для размещения блоков в HDFS 128M: False
но создание минимального размера разделения, большего, чем размер блока, увеличивает размер разделения, но за счет локальности.
Предположим, что минимальный размер разделения определен 128 МБ, а минимальный размер блока определен 64 МБ.
ПРИМЕЧАНИЕ. Поскольку по умолчанию HDFS каждый блок будет реплицирован на 3 различных узла данных HDFS. Также каждая задача карты выполняет свою операцию на одном блоке.
Следовательно, размер разбиения 128 МБ будет рассматривать 2 блока как один блок и создавать для него одну задачу карты, которая будет выполняться на одном канале данных. Это происходит за счет локальности данных. Под "стоимостью локальных данных" я имею в виду блок, который находится на датоделе, для которого не выполняется задача карты. Который должен быть извлечен из этого узла данных и обработан в этом месте, на котором выполняется задача карты, что приводит к снижению производительности.
Однако, если мы рассмотрим файл размером 128 МБ, с размером блока по умолчанию 64 МБ и минимальным разделенным размером по умолчанию 64 МБ, то в этом случае, как обычно, для каждой 64 МБ блока будут созданы две задачи карты.
Я пробовал использовать приведенную формулу, в которой размер блока составляет 128 МБ, но результаты не соответствуют ожиданиям. Я придумал приведенную ниже формулу, но она не имеет никакого смысла, но каждый раз дает мне правильный результат.
min(mapred.min.split.size, max(mapred.max.split.size, dfs.block.size))