我最近在Apache Spark中找到了a way to use logback instead of log4j(本地使用和$ echo 'SELECT t1.a,t1.b,t2.c,t2.d,t2.e
FROM TABLE1 t1
JOIN TABLE2 t2 on t1.a = t2.b' | grep -Po '(?<=FROM\s|JOIN\s)\w+'
TABLE1
TABLE2
)。但是,最后一件丢失了。
问题是Spark很难不在其类路径中看到spark-submit
设置。我已经找到了一种在本地执行期间加载它的方法:
基本上,检查系统属性logback.xml
,但是从我的logback.configurationFile
加载logback.xml
以防万一:
/src/main/resources/
然后当我初始化我的SparkContext时......
// 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
}
我可以确认它在本地有效。
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
事实证明......哇!那里没有文件!?有没有搞错!?为什么它不会在jar中找到该文件。它显然在那里,我做了三次检查它。
sc.addFile(getLogbackConfigPath)
所以我想,好的。我将传递我的文件,因为我可以指定系统属性。我将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
正确并将其正确传递给驱动程序和执行程序?
谢谢!
答案 0 :(得分:11)
java.io.FileNotFoundException
可能无法解析。
简单地说,SparkContext.addFile
无法从Jar内部读取文件。我认为它被视为某些zip
或类似的。
精细。
-Dlogback.configurationFile
由于我对配置参数的误解,这不起作用。
由于我使用的是--master yarn
参数,但我没有将--deploy-mode
指定为cluster
,因此默认为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" \