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

时间:2019-05-02 23:50:20

标签: apache-spark yarn typesafe-config

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

  1. env-common.properties
  2. application-txn.conf(此文件​​使用“包含”来引用上述文件)

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

我正在使用Typesafe配置库来解析我的“ application-main.conf”,并且在此主conf中,我试图通过替换使用env.properties文件中的属性,但变量名称无法解析:(我不确定为什么。

env.properties

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

application-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语句验证了这一点,并且应用程序在配置解析时失败。真的不确定现在发生了什么事:(。

任何想法都会导致此解决方案失败? 如果它有帮助:当我在本地运行多个配置文件时,分辨率可以正常工作

1 个答案:

答案 0 :(得分:1)

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

变量应位于字符串之外,如下所示:

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