2012-02-06 2 views
7

Предположим, что используется размер блока по умолчанию (128 МБ), и есть файл, использующий 130 МБ; поэтому используйте один полноразмерный блок и один блок с 2 МБ. Затем к файлу добавляется 20 МБ (сумма должна быть теперь 150 МБ). Что происходит?Как работает HDFS с append works

Действительно ли HDFS изменяет размер последнего блока с 2 МБ до 22 МБ? Или создать новый блок?

Как добавление к файлу в HDFS связано с непрозрачностью? Есть ли риск dataloss?

Создает ли HDFS третий блок, размещающий в нем 20 + 2 МБ, и удаляет блок с 2 МБ. Если да, то как это работает одновременно?

ответ

3

Согласно latest design document в Jira issuementioned before, мы находим следующие ответы на ваш вопрос:

  1. HDFS будет добавить к последний блок, не создать новый блок и скопировать данные из старый последний блок. Это не сложно, потому что HDFS просто использует обычную файловую систему для записи этих блочных файлов в качестве обычных файлов. Обычные файловые системы имеют механизмы для добавления новых данных. Конечно, если вы заполните последний блок, вы создадите новый блок.
  2. Одновременно в HDFS допускается только одна запись или добавление к любому файлу, поэтому для обработки не требуется параллелизм. Это управляется namenode. Вам нужно закрыть файл, если вы хотите, чтобы кто-то еще начал писать на него.
  3. Если последний блок в файле не реплицирован, приложение не будет выполнено. Приложение добавляется к одной реплике, которая связывает ее с репликами, подобно обычной записи. Мне кажется, что нет дополнительного риска dataloss по сравнению с обычной записью.
+0

Можете ли вы добавить к закрытому файлу? – David

+0

, если вы вызываете append в файл, который вы его открываете. вы не можете вызвать append в открытом файле. то, как только вы вызываете append и получаете выходной поток, вы можете начать сбрасывать свои байты в конец файла. – EthanP

+0

Если я правильно помню, когда эта функция была введена, вам нужно было бы оставить только что созданный файл, чтобы он мог «добавить» к нему (он же не настоящий append). Вы говорите, что теперь HDFS позволяет: 1) создать файл 2) закрыть его 3) повторно открыть его 4) добавить данные к нему? – David

1

Распределенная файловая система Hadoop поддерживает присоединение к файлам, и в этом случае она должна добавить 20 МБ ко второму блоку в вашем примере (тот, у которого вначале есть 2 МБ). Таким образом, вы получите два блока, один с 128 МБ и один с 22 МБ.

This - ссылка на приложение java docs для HDFS.

+4

Я понимаю, что путь остается тем же. Но поскольку блоки однократно пишут, я бы предположил, что HDFS создаст третий блок, разместив в нем 20 + 2 МБ, и удалит блок с 2 МБ. Но как это работает одновременно? – David

3

. Здесь приведено подробное описание design document о добавлении и содержит проблемы параллелизма.

Текущий HDFS docs дает ссылку на этот документ, поэтому мы можем предположить, что он является последним. (Дата документа - 2009 год)

И связанные с ним issue.