10

我最近找到了一种在 Apache Spark 中使用 logback 而不是 log4j的方法(用于本地使用和spark-submit)。但是,缺少最后一块。

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

到目前为止我所拥有的

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

// 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

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

谢谢!

4

1 回答 1

18

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

注意:在客户端模式下,这个配置不能直接在你的应用程序中通过 SparkConf 设置,因为此时驱动程序 JVM 已经启动。相反,请通过 --driver-java-options 命令行选项或在您的默认属性文件中进行设置。

所以通过这个设置--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" \
于 2017-08-07T10:30:22.780 回答