/ / Ako načítať typesafe configFactory zo súboru na hdfs? - java, scala, hadoop, typesafe-config

Ako načítať typfile configFactory zo súboru na hdfs? - java, scala, hadoop, typeafe-config

Na načítanie používam typesafe ConfigFactoryconfig do mojej scala aplikácie. Nechcem zahrnúť konfiguračné súbory do mojej nádoby, ale načítať ich namiesto toho z externého súborového systému hdfs. Nemôžem však nájsť jednoduchý spôsob, ako načítať konfiguráciu z objektu fsDataInputStream, ktorý získam z hadoopu:

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

To však vrhá výnimku EOFEx. Existuje jednoduchý spôsob, ako previesť objekt FSDataInputStream na požadovaný súbor java.io.File? našiel som Konverzia z FSDataInputStream na FileInputStream , ale pre takúto jednoduchú úlohu by to bolo dosť ťažkopádne.

odpovede:

5 pre odpoveď č. 1

Použitím ConfigFactory.parseReader by malo fungovať (ale netestoval som to):

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

0 pre odpoveď č. 2

Tu je to, čo som urobil s aplikáciou 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)
}

Teraz v kóde stačí použiť

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

Dúfam, že to pomôže.