apache-spark - 使用 Typesafe 配置时在 Spark YARN 客户端和集群模式之间切换
问题描述
一直在努力解决使用 Spark YARN 处理多个配置文件以及在集群和客户端模式之间切换的问题。
在我的应用程序中,我需要加载两个配置文件:
- 应用程序配置
- 环境配置
我目前的设置:
示例应用程序.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)
在集群模式下,上述设置有效,因为--files
spark-submit 命令的选项会将文件复制到集群模式中涉及的所有节点到与 jar 相同的位置。因此,提供配置文件的名称就足够了。
但是,我不确定如何使此设置正常工作,以便我可以轻松地将我的应用程序从客户端模式切换到集群模式。在客户端模式下,应用程序失败,因为 ConfigFactory 找不到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)
推荐阅读
- json - 将两个 JSON 数据合并为一个具有特定键值的数据
- llvm - 如何使用 LLVM 调用具有内联字符串的函数
- servicestack - IsAuthenticate 对于 servicestack 调用为 false,但对于 mvc 控制器为 true
- c# - 生成一个数字并填充数组
- java - 如何使用 JAXB (IntellijIdea) 从多个 xsd 生成 Java 类
- javascript - 如何在分析中按位置查看事件?
- typescript - 空对象的条件类型
- java - 在java中本地使用google doc
- ios - 显示为空的表视图
- python - 如何在熊猫中找到重叠最多的区间