我正在为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
答案 0 :(得分:0)
我能想到几个选项: -
SparkConf.setJars(....)
显式添加jar文件,或者如果它也被驱动程序使用,那么您也可以使用命令行选项{{1用于配置驱动程序类路径。尝试使用以下参数在Spark-default.conf中配置它: -
--driver-class-path
无论你做什么,我都会建议修复网络延迟,否则会影响Spark工作的性能。