我最近找到了一种在 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
正确地并将其正确地传递给驱动程序和执行程序?
谢谢!