在使用spark-yarn处理多个配置文件以及在集群模式和客户机模式之间切换时遇到了一个问题。
在我的应用程序中,我需要加载两个配置文件:
应用程序配置
环境配置
我的当前设置:
示例-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)
在集群模式下,上述设置工作,因为 --files
spark submit命令的选项将文件复制到集群模式下所有涉及的节点,并将其复制到与jar相同的位置。因此,提供配置文件的名称就足够了。
但是,我不知道如何让这个设置工作,这样我就可以很容易地将我的应用程序从客户机模式切换到集群模式。在客户端模式下,由于configfactory找不到 example-application.conf
来解析它。我可以通过提供应用程序配置的完整路径,然后提供include函数来解决这个问题 include required(file("env.conf"))
会失败的。
有没有关于如何设置它的建议,以便我可以轻松地在集群和客户机模式之间切换?
谢谢!
1条答案
按热度按时间mrphzbgm1#
传递配置文件的完整路径作为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)