spark-submit: - jars不起作用

时间:2016-01-15 04:03:09

标签: apache-spark spark-streaming

我正在为Spark Streaming作业构建度量系统,在系统中,度量标准在每个执行程序中收集,因此需要在每个执行程序中初始化度量源(用于收集度量的类)。

度量标准源打包在jar中,在提交作业时,jar使用参数' - jars'从本地发送到每个执行程序,然而,执行程序开始初始化度量标准源在jar到达之前的类,结果,它抛出class not found异常。

似乎如果执行者可以等到所有资源都准备就绪,问题就会得到解决,但我真的不知道怎么做。

有没有人面临同样的问题?

PS:我尝试使用HDFS(将jar复制到HDFS,然后提交作业并让执行程序从HDFS中的路径加载类),但它失败了。我检查了源代码,似乎类加载器只能解析本地路径。

这是日志,你可以看到jar在2016-01-15 18:08:07被添加到classpath,但初始化开始于2016-01-15 18:07:26

  

INFO 2016-01-15 18:08:07 org.apache.spark.executor.Executor:添加   文件:在/ var / lib中/火花/工人/工人-0 / APP-20160115180722-0041 / 0 /./ datainsights度量源组件-1.0.jar   到类加载器

     

ERROR 2016-01-15 18:07:26 Logging.scala:96 -   org.apache.spark.metrics.MetricsSystem:源类   org.apache.spark.metrics.PerfCounterSource无法实例化

这是我使用的命令:

spark-submit --verbose \
 --jars /tmp/datainsights-metrics-source-assembly-1.0.jar \ 
 --conf "spark.metrics.conf=metrics.properties" \
 --class org.microsoft.ofe.datainsights.StartServiceSignalPipeline \
 ./target/datainsights-1.0-jar-with-dependencies.jar

1 个答案:

答案 0 :(得分:0)

我能想到几个选项: -

  1. 创建一个Fat Jar文件,其中包含主要类和依赖项。
  2. 如果依赖项仅由执行程序而不是驱动程序使用,那么您可以使用SparkConf.setJars(....)显式添加jar文件,或者如果它也被驱动程序使用,那么您也可以使用命令行选项{{1用于配置驱动程序类路径。
  3. 尝试使用以下参数在Spark-default.conf中配置它: -

    --driver-class-path
  4. 无论你做什么,我都会建议修复网络延迟,否则会影响Spark工作的性能。