我正在为 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
我可以想到几个选项:-
- 创建一个 Fat Jar 文件,其中包括主类和依赖项。
- 如果依赖项仅由执行程序而不是驱动程序使用,那么您可以使用显式添加 jar 文件
SparkConf.setJars(....)
或者如果驱动程序也使用它,那么您也可以使用命令行选项--driver-class-path
用于配置驱动程序类路径。
-
尝试使用以下参数在 Spark-default.conf 中配置它:-
spark.executor.extraClassPath=<classapth>
spark.executor.extraClassPath=<classapth>
无论你做什么,我都建议修复网络延迟,否则会损害 Spark 作业的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)