使用Typesafe配置

曾经遇到过使用Spark YARN处理多个配置文件以及在集群和客户端模式之间切换的问题。

在我的应用程序中,我需要加载两个配置文件:

  1. 应用程序配置
  2. 环境配置

我当前的设置:

example-application.conf

include required(file("env.conf"))

app {
  source
    {
      source-name: "some-source"
      source-type: "file"
      source-path: ${env.some-source-path}
    }
   ....
}

env.conf:

env {
  some-source-path: "/path/to/file"
}

代码:

// Spark submit that works:
$SPARK_HOME/bin/spark-submit --class ${APP_MAIN_CLASS} \
    --master yarn \
    --deploy-mode cluster \
    --name ${APP_INSTANCE} \
    --files ${APP_BASE_DIR}/conf/${ENV_NAME}/env.conf,${APP_BASE_DIR}/conf/example-application.conf \
    --principal ${PRINCIPAL_NAME} --keytab ${KEYTAB_PATH} \
    --jars ${JARS} \
    --num-executors 10 \
    --executor-memory 4g \
    --executor-cores 4 \
    ${APP_JAR} "example-application.conf" "$@"

// How above file is loaded in code:
val appConfFile = new File(configFileName)   // configFileName = "example-application.conf"
val conf = ConfigFactory.parseFile(appConfFile)

在集群模式下,上述设置有效,因为spark-submit命令的--files选项会将文件复制到集群模式下涉及的所有节点上,并与jars相同。因此,提供配置文件的名称就足够了。

但是,我不确定如何使此设置正常工作,以便可以轻松地将应用程序从客户端切换为群集模式。在客户端模式下,应用程序失败,因为ConfigFactory无法找到example-application.conf进行解析。我可以通过提供应用程序配置的完整路径来解决此问题,但是包含函数include required(file("env.conf"))将失败。

关于如何进行设置的任何建议,以便我可以轻松地在集群模式和客户端模式之间切换?

谢谢!

iCMS 回答:使用Typesafe配置

作为spark-submit的一部分传递配置文件的完整路径,并处理在spark代码内部提取的逻辑。

spark.submit.deployMode=client然后采用完整路径,即${APP_BASE_DIR}/conf/example-application.conf

spark.submit.deployMode=cluster,然后仅使用文件名,即example-application.conf


// Spark submit that works:
$SPARK_HOME/bin/spark-submit --class ${APP_MAIN_CLASS} \
    --master yarn \
    --deploy-mode cluster \
    --name ${APP_INSTANCE} \
    --files ${APP_BASE_DIR}/conf/${ENV_NAME}/env.conf,${APP_BASE_DIR}/conf/example-application.conf \
    --principal ${PRINCIPAL_NAME} --keytab ${KEYTAB_PATH} \
    --jars ${JARS} \
    --num-executors 10 \
    --executor-memory 4g \
    --executor-cores 4 \
    ${APP_JAR} ${APP_BASE_DIR}/conf/example-application.conf "$@"

// How above file is loaded in code:

val configFile = if(!spark.conf.get("spark.submit.deployMode").contains("client")) configFileName.split("/").last else configFileName

val appConfFile = new File(configFile)   // configFileName = "example-application.conf"
val conf = ConfigFactory.parseFile(appConfFile)

本文链接:https://www.f2er.com/2292769.html

大家都在问