将多个类型安全配置文件传递给纱线集群模式应用程序

Passing multiple typesafe config files to a yarn cluster mode application

我在尝试在我的 Spark 应用程序中使用多个(通过包含)Typesafe 配置文件时遇到了一些困难,我正在以集群模式提交给 YARN 队列。我基本上有两个配置文件,文件布局如下:

  1. env-common.properties
  2. application-txn.conf(这个文件使用一个"include"来引用上面那个)

以上两个文件都在我的 application.jar 之外,所以我使用“--files”将它们传递给 yarn(如下所示)

我正在使用 Typesafe 配置库来解析我的 "application-main.conf" 并且在这个主配置文件中,我试图通过替换使用 env.properties 文件中的 属性,但是变量名没有得到解析 :( 我不确定为什么。

env.properties

txn.hdfs.fs.home=hdfs://dev/1234/data

申请-txn.conf:

# application-txn.conf
include required(file("env.properties"))

app {
  raw-data-location = "${txn.hdfs.fs.home}/input/txn-raw"
}

Spark 应用代码:


//propFile in the below block maps to "application-txn.conf" from the app's main method

def main {
  val config = loadConfig("application-txn.conf")
  val spark = SparkSession.builkder.getOrCreate()

  //Code fails here:
  val inputDF = spark.read.parquet(config.getString("app.raw-data-location"))
}

def loadConf(propFile:String): Config = {
   ConfigFactory.load()
   val cnf = ConfigFactory.parseResources(propFile)
   cnf.resolve()
}

Spark 提交代码(从 shell 脚本调用):

spark-submit --class com.nic.cage.app.Transaction \
--master yarn \
--queue QUEUE_1 \
--deploy-mode cluster \
--name MyTestApp \
--files application-txn.conf,env.properties \
--jars #Typesafe config 1.3.3 and my app.jar go here \
--executor-memory 2g \
--executor-cores 2 \
app.jar application-txn.conf 

当我 运行 执行上述操作时,我能够解析配置文件,但我的应用无法尝试从 HDFS 读取文件,因为它找不到名称为: ${txn.hdfs.fs.home}/input/txn-raw

我相信配置实际上能够读取这两个文件...否则它会因为 "required" 关键字而失败。我通过添加另一个带有虚拟文件名的 include 语句来验证这一点,并且应用程序在解析配置时失败。真的不确定现在发生了什么:(.

任何想法可能导致此解决方案失败? 如果有帮助:当我 运行 在本地使用多个配置文件时,解析工作正常

application-txn.conf中的语法错误。

变量应该在字符串之外,像这样:

raw-data-location = ${txn.hdfs.fs.home}"/input/txn-raw"