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 после записи, которая решит эту проблему