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

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

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

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

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

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

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

3 ответа

Решение

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

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

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

Я думаю, что ваше понимание верно.

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

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

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

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

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

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

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

Даже если dfs.replication Если установлено значение 3, операция записи будет считаться успешной, если dfs.namenode.replication.min ( default value : 1 ) был воспроизведен.

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

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

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

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

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

Другие вопросы по тегам