Загружать безопасные для типов конфигурации в формате HOCON из пользовательских мест во время выполнения.

У меня есть приложение, которое будет получать информацию о конфигурациях заданий через файлы (вероятно, десятки из них описывают конкретную работу, выполняемую приложением, желательно с гибкостью в отношении того, где они расположены), и для этого мы выбрали формат HOCON и безопасный тип. библиотеки

Это хорошо работает при загрузке разработки из папки ресурсов, но цель состоит в том, чтобы передать путь к этим файлам конфигурации во время выполнения через параметр при вызове spark-submit (spark-submit... pathToFile...).

Но чтение пути к файлу не выполняется с этой ошибкой:

val jConfig = ConfigFactory.load(path)

com.typesafe.config.ConfigException$Missing: system properties: No configuration setting found for key 'configuration'

Как я могу читать файлы конфигурации из других мест, кроме /resources?

Решение

Согласно совету @hagarwal, сработало следующее

val input = Source.fromFile(path,"UTF8").mkString
val jConfig = ConfigFactory.parseString(input)

person Welsige    schedule 03.10.2019    source источник


Ответы (1)


Сохраните конфигурацию в файловой системе HDFS/S3/ADFS/Local, передайте путь к файлу конфигурации программе в качестве аргумента, прочитайте файл конфигурации как входной поток (или файл) из пути к файлу конфигурации.

val confPath = args(0) //Configuration file path
val stream = Client.getObject(confPath) //Client -> HDFS/S3/ADFS/Local
val configString = Source.fromInputStream(stream.asInstanceOf[InputStream]).mkString
val config = ConfigFactory.parseString(configString)
person hagarwal    schedule 03.10.2019
comment
Попробую это реализовать, но из какого пакета исходит объект Client? - person Welsige; 03.10.2019
comment
Клиент будет поставляться из пакета HDFS/S3/ADFS/local в зависимости от того, где вы храните файл конфигурации. Лучше всего будет, если вы сохраните файл conf в распределенной файловой системе HDFS/S3/ADFS, а не в локальной файловой системе. - person hagarwal; 03.10.2019
comment
Я не смог найти импорт, который предоставил бы мне класс Client и метод getObject. Но благодаря вашему совету использовать parseString я смог заставить его работать с этим: val input = Source.fromFile(path,UTF8).mkString Спасибо. - person Welsige; 03.10.2019