Hadoop: файл HDFS пишет и читает

У меня есть основной вопрос относительно записи и чтения файлов в HDFS.

например, если я пишу файл, используя конфигурации по умолчанию, Hadoop внутренне должен записывать каждый блок на 3 узла данных. Я понимаю, что для каждого блока сначала клиент записывает блок в первый узел данных в конвейере, который затем сообщит второму и так далее. Как только третий узел данных успешно получает блок, он предоставляет подтверждение обратно узлу данных 2 и наконец, клиенту через узел данных 1. только после получения подтверждения для блока, запись считается успешной, и клиент приступает к записи следующего блока.

Если это так, то не требуется время для записи каждого блока больше, чем традиционная запись файла из - за -

  1. коэффициент репликации (по умолчанию 3) и
  2. процесс записи происходит последовательно после блока блок.

пожалуйста, поправьте меня, если я ошибаюсь в моем понимании. Кроме того, следующие вопросы ниже:

  1. Я понимаю, что чтение / запись файлов в Hadoop не имеет параллелизма, и лучшее, что он может выполнить, - это то же самое для традиционного чтения или записи файлов (т. е. если репликация установлена на 1) + некоторые накладные расходы, связанные с распределенным механизмом связи.
  2. параллелизм обеспечивается только на этапе обработки данных с помощью карты Уменьшить, но не во время чтения / записи файла клиентом.

3 ответов


Если ваш выше объяснение файл пишешь правильно, DataNode может читать и записывать данные одновременно. От руководство по архитектуре HDFS:

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

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


Я думаю, что ваше понимание является правильным.

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

но в Hadoop HDFS разработан по шаблону "написать один раз, прочитать много раз", поэтому основное внимание уделялось не производительности записи.

с другой стороны, вы можете найти параллелизм в Hadoop MapReduce (который может быть видел также клиент HDFS) разработан explicity для этого.


HDFS операция записи:

есть два параметра

dfs.replication : репликация блоков по умолчанию. Фактическое количество репликаций можно указать при создании файла. Значение по умолчанию используется, если репликация не указана в create time

dfs.namenode.replication.min: минимальная репликация блоков.

хотя dfs.replication установить как 3, операция записи будет считаться успешной один раз ДФХ.узел типа NameNode.копирование.мин (default value : 1) была воспроизведена.

но эта репликация до dfs.replication произойдет последовательный трубопровода. Первый Datanode записывает блок и перенаправляет его во второй Datanode. Второй Datanode записывает блок и пересылает его в третий Datanode.

DFSOutputStream также поддерживает внутреннюю очередь пакетов, которые ждут подтверждения с помощью datanodes, называемых очередью ack. пакет удаляется из очереди АСК только тогда, когда он подтвержден всех узлов DataNode в трубопроводе.

посмотрите на связанный вопрос SE:подтверждение операции записи данных Hadoop 2.0

HDFS операции чтения:

операции чтения HDFS происходят в parallel вместо последовательных, как операции записи