我正在使用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())
但是,这会引发EOFException。有没有一种简单的方法将FSDataInputStream对象转换为所需的java.io.File?我找到了Converting from FSDataInputStream to FileInputStream,但这对于这么简单的任务来说非常麻烦。
答案 0 :(得分:6)
使用ConfigFactory.parseReader
应该有效(但我还没有测试过):
val reader = new InputStreamReader(file)
val config = try {
ConfigFactory.parseReader(reader)
} finally {
reader.close()
}
答案 1 :(得分:0)
以下是我对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")
我希望它有所帮助。
答案 2 :(得分:0)
您应该能够使用以下代码在hdfs中加载.conf文件:
ConfigFactory.parseFile(new File("application.conf"));
请记住,.conf文件应与您的应用程序文件放在同一目录(例如spark中的jar文件)。