如何通过Spark submit命令外部加载application.conf与Log4j.properties
问题根因
- 你通过
--files上传的配置文件会被Spark分发到Driver和Executor的当前工作目录,而你在extraJavaOptions里指定的是提交节点的本地绝对路径,绝大多数情况下Executor节点上不存在该路径,Typesafe Config找不到指定路径的application.conf时,就会自动降级加载Classpath下Jar包内置的配置文件。 - Log4j配置你仅通过
--driver-java-options给Driver进程传了参数,没有给Executor传,Executor的日志配置依然会走内置文件,你之前观察到的Log4j生效仅为Driver侧的表现。 - 你的
--driver-java-options参数里缺少-前缀,正确的系统参数格式应为-Dxxx=xxx而非Dxxx=xxx,该写法属于参数错误。
解决方案
根据你的集群配置可以选择以下两种方案之一:
方案1:所有集群节点都已存放配置文件到相同路径
如果Driver和所有Executor节点的/opt/apps/spark/code/src/main/resources/目录下都已经存在两个配置文件,直接修正参数即可:
/opt/apps/spark/bin/spark-submit \ --conf spark.driver.extraJavaOptions="-Dconfig.file=/opt/apps/spark/code/src/main/resources/application.conf -Dlog4j.configuration=file:///opt/apps/spark/code/src/main/resources/Log4j.properties" \ --conf spark.executor.extraJavaOptions="-Dconfig.file=/opt/apps/spark/code/src/main/resources/application.conf -Dlog4j.configuration=file:///opt/apps/spark/code/src/main/resources/Log4j.properties" \ --class com.ericsson.dnb.main.staging.SnifferReportStatus \ /opt/apps/spark/code/target/scala-2.12/dnb-reporting-1A-4.0.0.ft.jar
提示:
spark.driver.extraJavaOptions已经包含了--driver-java-options的作用,统一在前者配置即可避免参数冲突。
方案2:仅提交节点存放配置文件,通过--files自动分发
如果只有提交任务的节点上有这两个配置文件,用--files参数让Spark自动分发到所有进程的工作目录,直接引用文件名即可:
/opt/apps/spark/bin/spark-submit \ --files /opt/apps/spark/code/src/main/resources/application.conf,/opt/apps/spark/code/src/main/resources/Log4j.properties \ --conf spark.driver.extraJavaOptions="-Dconfig.file=./application.conf -Dlog4j.configuration=file:./Log4j.properties" \ --conf spark.executor.extraJavaOptions="-Dconfig.file=./application.conf -Dlog4j.configuration=file:./Log4j.properties" \ --class com.ericsson.dnb.main.staging.SnifferReportStatus \ /opt/apps/spark/code/target/scala-2.12/dnb-reporting-1A-4.0.0.ft.jar
验证方法
如果调整后依然不生效,可以在代码初始化位置打印配置来源确认加载路径:
// Scala代码示例 import com.typesafe.config.ConfigFactory println(ConfigFactory.load().origin())
内容的提问来源于stack exchange,提问作者Jashchawla
相关产品推荐
相关产品推荐

