Я создаю подпружиненный сервис, который записывает данные в 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
после того, как все остальные бины действительно уничтожены (не уничтожены)?
Спасибо!