将系统 属性 传递给 spark-submit 并从类路径或自定义路径读取文件

Pass system property to spark-submit and read file from classpath or custom path

我最近在 Apache Spark 中找到 a way to use logback instead of log4j(供本地使用和 spark-submit)。但是,最后一块不见了。

问题是 Spark 非常努力地试图不在其类路径中看到 logback.xml 设置。我已经找到了在本地执行时加载它的方法:

到目前为止我有什么

基本上,检查系统 属性 logback.configurationFile,但从我的 /src/main/resources/ 加载 logback.xml 以防万一:

// the same as default: https://logback.qos.ch/manual/configuration.html
private val LogbackLocation = Option(System.getProperty("logback.configurationFile"))
// add some default logback.xml to your /src/main/resources
private lazy val defaultLogbackConf = getClass.getResource("/logback.xml").getPath

private def getLogbackConfigPath = {
   val path = LogbackLocation.map(new File(_).getPath).getOrElse(defaultLogbackConf)
   logger.info(s"Loading logging configuration from: $path")
   path
}

然后当我初始化我的 SparkContext 时...

val sc = SparkContext.getOrCreate(conf)
sc.addFile(getLogbackConfigPath)

我可以确认它在本地有效。

spark-submit一起玩

spark-submit \
  ...
  --master yarn \
  --class com.company.Main\
  /path/to/my/application-fat.jar \
  param1 param2 

这给出了一个错误:

Exception in thread "main" java.io.FileNotFoundException: Added file file:/path/to/my/application-fat.jar!/logback.xml does not exist

我认为这是无稽之谈,因为首先应用程序会找到文件(根据我的代码)

getClass.getResource("/logback.xml").getPath

然后,在

期间
sc.addFile(getLogbackConfigPath)

事实证明……哇!那里没有文件!?有没有搞错!?为什么它找不到 jar 中的文件。它显然在那里,我做了三重检查。

spark-submit

的另一种方法

所以我想,好吧。我将传递我的文件,因为我可以指定系统 属性。我将 logback.xml 文件放在我的 application-fat.jar 旁边并且:

spark-submit \
  ...
  --conf spark.driver.extraJavaOptions="-Dlogback.configurationFile=/path/to/my/logback.xml" \
  --conf spark.executor.extraJavaOptions="-Dlogback.configurationFile=/path/to/my/logback.xml" \
  --master yarn \
  --class com.company.Main\
  /path/to/my/application-fat.jar \
  param1 param2 

我得到了和上面一样的错误。所以我的设置完全被忽略了!为什么?如何指定

-Dlogback.configurationFile

正确并将其正确传递给驱动程序和执行程序?

谢谢!

1。求解 java.io.FileNotFoundException

可能无法解决

简单地说,SparkContext.addFile 无法从 Jar 中读取文件。我相信它在某些 zip 或类似的地方被对待。

很好。

2。通过 -Dlogback.configurationFile

由于我对配置参数的误解,这没有用。

因为我用的是--master yarn参数,但是我没有指定--deploy-modecluster,默认是client.

阅读https://spark.apache.org/docs/1.6.1/configuration.html#application-properties

spark.driver.extraJavaOptions

Note: In client mode, this config must not be set through the SparkConf directly in your application, because the driver JVM has already started at that point. Instead, please set this through the --driver-java-options command line option or in your default properties file.

因此,通过 --driver-java-options 传递此设置有效:

spark-submit \
  ...
  --driver-java-options "-Dlogback.configurationFile=/path/to/my/logback.xml" \
  --master yarn \
  --class com.company.Main\
  /path/to/my/application-fat.jar \
  param1 param2 

关于 --driver-java-options

的注意事项

--conf相反,多个参数必须作为一个参数传递,例如:

--driver-java-options "-Dlogback.configurationFile=/path/to/my/logback.xml -Dother.setting=value" \

而下面的将不起作用

--driver-java-options "-Dlogback.configurationFile=/path/to/my/logback.xml" \
--driver-java-options "-Dother.setting=value" \