使用类型安全配置时在 Spark YARN 客户端和群集模式之间切换



一直在努力解决使用 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 {
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选项会将文件复制到群集模式下涉及的所有节点,与 jar 相同的位置。因此,提供配置文件的名称就足够了。

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

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

谢谢!

将配置文件的完整路径作为 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)

相关内容

  • 没有找到相关文章

最新更新