apache-spark - Spark 提交: --jars does not work

标签 apache-spark spark-streaming

我正在为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

最佳答案

我可以想到几个选项:-

  1. 创建一个 Fat Jar 文件,其中包含主类和依赖项。
  2. 如果依赖项仅由执行程序使用,而不由驱动程序使用,那么您可以使用 SparkConf.setJars(....) 显式添加 jar 文件,或者如果驱动程序也使用它,那么您还可以使用命令行选项--driver-class-path来配置驱动程序类路径。
  3. 尝试使用以下参数在 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/

相关文章:

python - 在 Python Spark 中查看 RDD 内容?

apache-spark - 使用python在spark 2.3.0中流式传输Spark Kafka

hadoop - Spark Streaming异常处理策略

pyspark - Dataproc 上的 Spark 流数据管道遇到突然频繁的套接字超时

apache-spark - Apache Spark - 为什么要删除执行程序? 'Idle' 是什么意思?

java - 如何在 Java 中使用 Spark 的 .newAPIHadoopFile()

scala - 了解 Kryo 序列化缓冲区溢出错误

scala - 在 apache Spark 数据框中分解数组

Python - 将整数或字符串发送到 Spark-Streaming

azure - 自动加载器过滤重复项