Должна ли Hadoop FileSystem быть закрыта? - PullRequest
2 голосов
/ 14 марта 2019

Я создаю подпружиненный сервис, который записывает данные в Hadoop с использованием API файловой системы. Некоторые данные записываются в файл паркета, а большие блоки кэшируются в памяти, поэтому, когда служба закрыта, в Hadoop может быть записано несколько сотен МБ данных.

FileSystem автоматически закрывается по умолчанию, поэтому при закрытии службы иногда FileSystem закрывается до закрытия всех устройств записи, что приводит к повреждению файлов паркета.

В файловой системе Configuration есть флаг fs.automatic.close, но экземпляр FileSystem используется из нескольких потоков, и я не знаю какого-либо простого способа дождаться завершения их всех, прежде чем закрывать FileSystem вручную. Я попытался использовать специальный закрывающий bean-компонент для файловой системы, реализующий Spring SmartLifeCycle с max phase, поэтому он уничтожается последним, но фактически он не уничтожается последним, а уведомляется о завершении работы в последний раз, в то время как другие компоненты все еще находятся в процессе выключения.

В идеале каждый объект, которому нужен FileSystem, получит его и будет отвечать за его закрытие. Проблема в том, что FileSystem.get(conf) возвращает кэшированный экземпляр. Существует FileSystem.newInstance(conf), но не ясно, каковы последствия использования нескольких экземпляров FileSystem с точки зрения производительности. Есть еще одна проблема - нет способа передать экземпляр FileSystem в ParquetWriter - он получает один , используя path.getFileSystem(conf). И можно было бы подумать, что строка вернет FileSystem экземпляр, назначенный только этому файлу, но один будет неправильным - скорее всего, тот же кэшированный экземпляр будет возвращен , поэтому закрытие будет неправильным.

Есть ли рекомендуемый способ управления жизненным циклом FileSystem? Что произойдет, если FileSystem создается с fs.automatic.close, установленным на true, и никогда не закрывается вручную? Может быть, Spring-Boot поддерживает чистый способ закрытия FileSystem после того, как все остальные бины действительно уничтожены (не уничтожены)?

Спасибо!

...