火花提交:--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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥在火花中运行时配置单元查询不起作用

通过火花数据框读取 S3 文件时,胶水书签不起作用

Gradle:由 gradle bootJar 任务创建的 jar 不起作用

为啥 jar 执行的通配符在 docker CMD 中不起作用?

一招破解新引入的jar包不起作用

带有按钮 setCellRenderer() 的可执行 Jar 不起作用