Java 如何从hdfs上的文件加载typesafe configFactory?

Java 如何从hdfs上的文件加载typesafe configFactory?,java,scala,hadoop,typesafe-config,Java,Scala,Hadoop,Typesafe Config,我正在使用typesafe ConfigFactory将配置加载到scala应用程序中。我不想将配置文件包括到jar中,而是从外部hdfs文件系统加载它们。但是,我找不到从hadoop获得的fsDataInputStream对象加载配置的简单方法: //get HDFS file val hadoopConfig: Configuration = sc.hadoopConfiguration val fs: FileSystem = org.apache.hadoop.fs.FileSystem

我正在使用typesafe ConfigFactory将配置加载到scala应用程序中。我不想将配置文件包括到jar中,而是从外部hdfs文件系统加载它们。但是,我找不到从hadoop获得的fsDataInputStream对象加载配置的简单方法:

//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())

但是,这会引发一个EOFEException。是否有一种简单的方法将FSDataInputStream对象转换为所需的java.io.File?我发现了,但对于这样一个简单的任务来说,这将是相当麻烦的

使用
ConfigFactory.parseReader
应该可以工作(但我还没有测试它):


以下是我对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")

我希望它有帮助。

您应该能够使用以下代码在hdfs中加载.conf文件:

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

请记住,.conf文件应与应用程序文件放在同一目录下(例如spark中的jar文件)。

工作正常!谢谢,我们可以在hdfs的typesafe配置文件中包含文件吗<代码>包含文件(“hdfs://home//XYZ.conf)我不知道。为什么不试试呢?
ConfigFactory.parseFile(new File("application.conf"));