/ / Come caricare typife configFactory dal file su hdfs? - java, scala, hadoop, typesafe-config

Come caricare typife configFactory dal file su hdfs? - java, scala, hadoop, typesafe-config

Sto usando ConfigFactory typesafe per caricare il fileconfig nella mia scala applicazione. Non voglio includere i file di configurazione nel mio contenitore, ma caricarli invece da un filesystem esterno di hdfs. Tuttavia, non riesco a trovare un modo semplice per caricare la configurazione dall'oggetto fsDataInputStream che ottengo da 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())

Tuttavia, questo genera una EOFException. C'è un modo semplice per convertire l'oggetto FSDataInputStream nel file java.io.File richiesto? ho trovato Conversione da FSDataInputStream a FileInputStream ma questo sarebbe piuttosto complicato per un compito così semplice.

risposte:

5 per risposta № 1

utilizzando ConfigFactory.parseReader dovrebbe funzionare (ma non l'ho testato):

val reader = new InputStreamReader(file)
val config = try {
ConfigFactory.parseReader(reader)
} finally {
reader.close()
}

0 per risposta № 2

Ecco cosa ho fatto con l'applicazione 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)
}

Ora nel codice, basta usare

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

Spero possa essere d'aiuto.