火花提交:--jars 不起作用

Byr*_*ang 5 apache-spark spark-streaming

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

指标源被打包在一个jar中,提交作业时,使用参数“--jars”将jar从本地发送到每个执行器,但是,执行器在jar到达之前就开始初始化指标源类,作为结果,它抛出类未找到异常。

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

有人面临同样的问题吗?

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

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

信息 2016-01-15 18:08:07 org.apache.spark.executor.Executor:添加文件:/var/lib/spark/worker/worker-0/app-20160115180722-0041/0/./datainsights-metrics -source- assembly-1.0.jar 到类加载器

错误 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
Run Code Online (Sandbox Code Playgroud)

Sum*_*mit 0

我可以想到几个选项:-

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

    spark.executor.extraClassPath=<classapth>
    spark.executor.extraClassPath=<classapth>
    
    Run Code Online (Sandbox Code Playgroud)

无论你做什么,我都建议修复网络延迟,否则会损害 Spark 作业的性能。