HDFS ls показывает размер файла 0, в то время как Flume пишет файл

В настоящее время мы работаем над настройкой системы Apache Flume, которая собирает данные о событиях и записывает их в файлы в нашем кластере HDFS HDInsight. При проверке начальной настройки hdfs ls отображает 0 для размера файла, когда Flume пишет в файл, но когда файл катится (и расширение файла.tmp удалено), размер файла внезапно увеличивается.

Существует ли какая-либо причина, связанная с HDFS или HDInsight (или WASB), что размер файла для файла будет равен 0, пока Flume выполняет запись в файл.

2 ответа

Решение

Возможно, это связано с моделью когерентности HDFS.

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

HDFS предоставляет способ принудительно сбросить все буферы в датоды с помощью метода hflush() в FSDataOutputStream. После успешного возврата из hflush() HDFS гарантирует, что данные, записанные до этого момента в файле, достигли всех датоданов в конвейере записи и будут видны всем новым читателям. Статистические данные о размере файла и т. Д. Будут доступны после успешного завершения вышеуказанного процесса.

При использовании хранилища BLOB-объектов Azure используйте BLOB-объекты страницы вместо BLOB-объектов, если hflush() гарантии требуются.

CodeReaper ответ правильный. Чтобы разобраться с контекстом в Azure, блочные объекты не (как и ожидалось) не реализуют hflush(): вызов hflush() фактически сбрасывает буфер клиента SDK в хранилище Azure в памяти. Данные хранятся в этом временном кэше по умолчанию 7 дней, но не доступны в виде блочного блоба до sync() или же close() называется. Page Blobs действительно гарантирую, что данные помещаются на диск HDFS при каждом hflush() вызов.

Hdfs вычисляет размер на основе отчета lastblocklength. В вашем сценарии, я думаю, вы все еще пишете в hdfs и пытаетесь получить размер файла, а hdfs не знает, как рассчитать размер, поскольку у него нет отчета lastblocklength. Попробуйте использовать hflush после записи, которая решит эту проблему

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