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

时间:2017-08-03 17:17:32

标签: java scala apache-spark apache-spark-2.0 spark-submit

我最近在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 

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

谢谢!

1 个答案:

答案 0 :(得分:11)

1。解决java.io.FileNotFoundException

可能无法解析

简单地说,SparkContext.addFile无法从Jar内部读取文件。我认为它被视为某些zip或类似的。

精细。

2。传递-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" \