首页 > 解决方案 > Apache Spark:如何添加默认和特定依赖项?

问题描述

我的 spark-defaults.conf :

#a package I need everytime
spark.jars.packages org.influxdb:influxdb-java:2.14 

当我开始工作时:

spark-shell --master yarn --num-executors 6 --packages "a random package that I need only for this job specifically"

我收到此错误:

java.lang.NoClassDefFoundError: org/influxdb/InfluxDBFactory
  at ch.cern.sparkmeasure.InfluxDBSink.<init>(influxdbsink.scala:53)
  at ch.cern.sparkmeasure.InfluxDBSinkExtended.<init>(influxdbsink.scala:232)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  at org.apache.spark.util.Utils$$anonfun$loadExtensions$1.apply(Utils.scala:2688)
  at org.apache.spark.util.Utils$$anonfun$loadExtensions$1.apply(Utils.scala:2680)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
  at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
  at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
  at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
  at org.apache.spark.util.Utils$.loadExtensions(Utils.scala:2680)
  at org.apache.spark.SparkContext$$anonfun$setupAndStartListenerBus$1.apply(SparkContext.scala:2387)
  at org.apache.spark.SparkContext$$anonfun$setupAndStartListenerBus$1.apply(SparkContext.scala:2386)
  at scala.Option.foreach(Option.scala:257)
  at org.apache.spark.SparkContext.setupAndStartListenerBus(SparkContext.scala:2386)
  at org.apache.spark.SparkContext.<init>(SparkContext.scala:555)
  at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2520)
  at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:935)
  at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:926)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:926)
  at org.apache.spark.repl.Main$.createSparkSession(Main.scala:106)
  ... 62 elided
Caused by: java.lang.ClassNotFoundException: org.influxdb.InfluxDBFactory
  at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  ... 88 more

我认为 --packages 覆盖 spark-default.conf 中的包,所以我收到此错误

我不想每次都包含 influxdb 包。

当我使用 --packages 启动作业时,我希望在 spark-default.conf 和动态包中包含 fixe 包,但它似乎不兼容。

任何想法 ?

标签: apache-sparkdependencies

解决方案


该类确实是 influxdb-java 的一部分,所以你不应该得到那个错误。特别是如果您的代码甚至没有尝试使用 Influx 包

但是,如果您有特定于某个应用程序的包,您实际上应该将它们打包为该应用程序的一部分。然后其他人也可以运行它并且不记得火花提交选项的具体调用

如果您为代码使用构建系统,请考虑创建一个 uber jar

我不熟悉 spark-defaults 的语义或者它是否被覆盖,但如果你确实有包总是需要成为 Spark 应用程序的一部分,你应该直接将 JAR 下载到 Spark 工作者类路径中,而不是让应用程序下载他们每次


推荐阅读