gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:43 24 4
gpt4 key购买 nike

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

问题是 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,默认是客户端

阅读 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" \

关于java - 将系统属性传递给 spark-submit 并从类路径或自定义路径读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45490778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com