火花提交:--jars 不起作用
Posted
技术标签:
【中文标题】火花提交:--jars 不起作用【英文标题】:spark-submit: --jars does not work 【发布时间】:2016-01-15 04:03:09 【问题描述】:我正在为 Spark Streaming 作业构建度量系统,在系统中,度量是在每个执行器中收集的,因此需要在每个执行器中初始化一个度量源(用于收集度量的类)。
metrics源被打包在一个jar中,当提交作业时,jar是通过参数'--jars'从本地发送到每个executor,但是executor在jar到达之前就开始初始化metrics源类,因此,它抛出类未找到异常。
看来如果executor可以等到所有资源都准备好,问题就解决了,但我真的不知道怎么办。
有人遇到同样的问题吗?
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/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
【问题讨论】:
你能把你试过的命令贴出来吗? 好像jar被加载到了classpath,但是由于网络延迟,这个过程很慢。结果,我遇到了另一个问题,我已经更新了问题。详情请看。 【参考方案1】:我可以想到几个选项:-
-
创建一个 Fat Jar 文件,其中包含主要类和依赖项。
如果依赖项仅由执行程序使用而不由驱动程序使用,那么您可以使用
SparkConf.setJars(....)
显式添加jar 文件,或者如果驱动程序也使用它,那么您也可以使用命令行选项--driver-class-path
进行配置驱动程序类路径。
尝试使用以下参数在 Spark-default.conf 中配置它:-
spark.executor.extraClassPath=<classapth>
spark.executor.extraClassPath=<classapth>
无论你做什么,我都建议修复网络延迟,否则会影响 Spark 作业的性能。
【讨论】:
感谢您的回复,我试过这个方法,jar被发送到每个executor,但是executor在jar到达executor之前立即开始初始化。也许网络确实是个问题,但我认为 Spark 应该有一个功能来确保所有资源在 executor 开始初始化之前到达 executor以上是关于火花提交:--jars 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Gradle:由 gradle bootJar 任务创建的 jar 不起作用