我正在为Spark Streaming作业构建指标系统,在系统中,指标是在每个执行器中收集的,因此需要在每个执行器中初始化指标源(用于收集指标的类)。
Metrics源被打包在一个jar中,提交作业时,使用参数'--jars'从本地将jar发送到每个执行器,但是,执行器在jar到达之前就开始初始化Metrics源类,结果,它抛出类未找到异常。
看起来如果执行器可以等到所有资源都准备好,问题就可以解决,但我真的不知道该怎么做。
有人遇到同样的问题吗?
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: Adding file:/var/lib/spark/worker/worker-0/app-20160115180722-0041/0/./datainsights-metrics-source-assembly-1.0.jar to class loader
ERROR 2016-01-15 18:07:26 Logging.scala:96 - org.apache.spark.metrics.MetricsSystem: Source class org.apache.spark.metrics.PerfCounterSource cannot be instantiated
这是我使用的命令:
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
最佳答案
我可以想到几个选项:-
- 创建一个 Fat Jar 文件,其中包含主类和依赖项。
- 如果依赖项仅由执行程序使用,而不由驱动程序使用,那么您可以使用
SparkConf.setJars(....)
显式添加 jar 文件,或者如果驱动程序也使用它,那么您还可以使用命令行选项--driver-class-path
来配置驱动程序类路径。 尝试使用以下参数在 Spark-default.conf 中配置它:-
spark.executor.extraClassPath=<classapth> spark.executor.extraClassPath=<classapth>
无论你做什么,我都建议修复网络延迟,否则会损害 Spark 作业的性能。
关于apache-spark - Spark 提交: --jars does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34804209/