Hadoop: файл HDFS пишет и читает
У меня есть основной вопрос относительно записи и чтения файлов в HDFS.
например, если я пишу файл, используя конфигурации по умолчанию, Hadoop внутренне должен записывать каждый блок на 3 узла данных. Я понимаю, что для каждого блока сначала клиент записывает блок в первый узел данных в конвейере, который затем сообщит второму и так далее. Как только третий узел данных успешно получает блок, он предоставляет подтверждение обратно узлу данных 2 и наконец, клиенту через узел данных 1. только после получения подтверждения для блока, запись считается успешной, и клиент приступает к записи следующего блока.
Если это так, то не требуется время для записи каждого блока больше, чем традиционная запись файла из - за -
- коэффициент репликации (по умолчанию 3) и
- процесс записи происходит последовательно после блока блок.
пожалуйста, поправьте меня, если я ошибаюсь в моем понимании. Кроме того, следующие вопросы ниже:
- Я понимаю, что чтение / запись файлов в Hadoop не имеет параллелизма, и лучшее, что он может выполнить, - это то же самое для традиционного чтения или записи файлов (т. е. если репликация установлена на 1) + некоторые накладные расходы, связанные с распределенным механизмом связи.
- параллелизм обеспечивается только на этапе обработки данных с помощью карты Уменьшить, но не во время чтения / записи файла клиентом.
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
вместо последовательных, как операции записи