Будет ли mapreduce использовать узел, на котором находится большая часть gzip-файла?

У меня есть кластер HDFS с большими файлами gzip.

Я убедился, что все блоки этих gzip файлов находятся в одном и том же узле данных, записав их в HDFS из этого узла данных.

for i in {1..10}; do
    scp file$i.gz datanode1:
    ssh datanode$i hadoop fs -put file$i.gz /data/
done

Теперь я хочу запустить задачу mapreduce для всех этих файлов.

Я ожидаю, что JobTracker поставит задание на обработку file1 на datanode1, где все блоки.

Действительно, если датанода умрет, я потеряю локальность, но будет ли она работать, пока не умрет?

Если это так не работает, могу ли я написать FileInputFormat, который будет это делать?


person Chi-Lan    schedule 13.05.2013    source источник


Ответы (1)


GZip не является разделяемым форматом сжатия (ну, это если вы складываете файлы gzip в конец), поэтому я сначала должен убедиться, что размер блока ваших файлов gzip такой же / больше, чем фактические размеры файлов.

Поскольку файл gzip нельзя разделить, если у вас есть файл gzip размером 1 ГБ с размером блока 256 м, есть вероятность, что не все блоки этого файла находятся на одном и том же узле данных (даже если вы загружаете с одного из узлов данных, нет никакой гарантии, что с течением времени при сбоях и, конечно же, блоки не будут перемещены на другие узлы). В этом случае средство отслеживания заданий никогда не сообщит о задаче локальной карты, если какой-либо из блоков не является резидентным на узле, где выполняется задача.

Что касается назначения задач - если у вас есть, скажем, 4 слота карты на datanode1, но 100 файлов для обработки, то трекер заданий не будет запускать все 100 задач на datanode1. Он попытается запустить задачу на datanode1, если на этом узле есть свободный слот задачи и задача карты, которая имеет разделенные местоположения на этом узле, но если эти 4 слота используются, JT даст указание другим средствам отслеживания задач запустить задания (если у них есть свободные слоты), а не ждать выполнения всех 100 заданий на одном узле.

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

person Chris White    schedule 13.05.2013
comment
Я понимаю, что это не гарантируется, но пытается ли он вообще планировать задания на DataNode с большинством блоков? - person Chi-Lan; 13.05.2013
comment
По сути, да, если у JT есть 100 задач карты, которые еще предстоит выполнить, а у TT есть свободный слот для задач карты, он попытается запустить задачу, которая будет локальной для этого TT. - person Chris White; 15.05.2013