我最近发现一种使用 logback 代替 log4j 的方法 https://stackoverflow.com/a/45480145/1549135在 Apache Spark 中(既适合本地使用,也适合spark-submit
)。然而,还缺少最后一块。
问题是 Spark 非常努力地不去看logback.xml
其类路径中的设置。我已经找到了一种在本地执行期间加载它的方法:
到目前为止我所拥有的
基本上,检查系统属性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 内找不到该文件。显然它就在那里,我做到了triple检查了它。
另一种方法spark-submit
所以我想,好吧。我将传递我的文件,因为我可以指定系统属性。我把logback.xml
文件在我旁边application-fat.jar
and:
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
正确地将其传递给驱动程序和执行者?
Thanks!