Как загрузить typesafe configFactory из файла на hdfs?

Я использую typesafe ConfigFactory для загрузки конфигурации в мое приложение scala. Я не хочу включать файлы конфигурации в свою банку, а вместо этого загружаю их из внешней файловой системы hdfs. Однако я не могу найти простой способ загрузить конфигурацию из объекта fsDataInputStream, который я получаю от hadoop:

//get HDFS file
val hadoopConfig: Configuration = sc.hadoopConfiguration
val fs: FileSystem = org.apache.hadoop.fs.FileSystem.get(hadoopConfig)
val file: FSDataInputStream = fs.open(new Path("hdfs://SOME_URL/application.conf"))
//read config from hdfs
val config: Config = ConfigFactory.load(file.readUTF())

Однако это вызывает исключение EOFException. Есть ли простой способ преобразовать объект FSDataInputStream в требуемый java.io.File? Я нашел преобразование из FSDataInputStream в FileInputStream , но это было бы довольно громоздко для такого простого задача.


person Malte    schedule 30.06.2016    source источник


Ответы (3)


Использование ConfigFactory.parseReader должно работать (но я не проверял):

val reader = new InputStreamReader(file)
val config = try {
  ConfigFactory.parseReader(reader)
} finally {
  reader.close()
}
person Alexey Romanov    schedule 30.06.2016
comment
Работает отлично! Спасибо - person Malte; 30.06.2016
comment
Можем ли мы включить файлы внутри конфигурационного файла typesafe из hdfs. include file("hdfs://home//XYZ.conf") - person Pushpendra Jaiswal; 04.08.2016
comment
Я не знаю. Почему бы не попробовать? - person Alexey Romanov; 04.08.2016

Вы должны иметь возможность загрузить файл .conf в hdfs, используя следующий код:

ConfigFactory.parseFile(new File("application.conf"));

Имейте в виду, что файл .conf должен быть помещен в тот же каталог, что и файл вашего приложения (например, файл jar в spark).

person Yohan Chung    schedule 18.02.2019

Вот что я сделал с приложением Spark:

  /**
    * Load typesafe's configuration from hdfs file location
    * @param sparkContext
    * @param confHdfsFileLocation
    * @return
    */
  def loadHdfsConfig(sparkContext: SparkContext, confHdfsFileLocation: String) : Config = {
    // Array of 1 element (fileName, fileContent)
    val appConf: Array[(String, String)] = sparkContext.wholeTextFiles(confHdfsFileLocation).collect()
    val appConfStringContent = appConf(0)._2
    ConfigFactory.parseString(appConfStringContent)
  }

Теперь в коде просто используйте

val config = loadHdfsConfig(sparkContext, confHdfsFileLocation)
config.getString("key-here")

Я надеюсь, что это помогает.

person Quang Gia Le    schedule 27.04.2018