java.lang.NoClassDefFoundError:org/apache/spark/sq/sources/v2/StreamingWriteSupportProvider试图从scala中的kafka主题中提取
我正在使用一个java.lang.NoClassDefFoundError:org/apache/spark/sq/sources/v2/StreamingWriteSupportProvider试图从scala中的kafka主题中提取,scala,apache-spark,apache-kafka,spark-shell,Scala,Apache Spark,Apache Kafka,Spark Shell,我正在使用一个sparkshell实例来测试从客户机的kafka源中提取数据的过程。为了启动实例,我使用命令sparkshell--jars spark-sql-kafka-0-10_2.11-2.5.0-palantir.8.jar、kafka_2.12-2.5.0.jar、kafka-clients-2.5.0.jar(所有jar都存在于woring目录中) 但是,当我在几秒钟后运行命令val df=spark.read.format(“kafka”)……时,它崩溃如下: java.lang
sparkshell
实例来测试从客户机的kafka源中提取数据的过程。为了启动实例,我使用命令sparkshell--jars spark-sql-kafka-0-10_2.11-2.5.0-palantir.8.jar、kafka_2.12-2.5.0.jar、kafka-clients-2.5.0.jar
(所有jar都存在于woring目录中)
但是,当我在几秒钟后运行命令val df=spark.read.format(“kafka”)……
时,它崩溃如下:
java.lang.NoClassDefFoundError: org/apache/spark/sql/sources/v2/StreamingWriteSupportProvider
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:370)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at scala.collection.convert.Wrappers$JIteratorWrapper.next(Wrappers.scala:43)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala:247)
at scala.collection.TraversableLike$class.filter(TraversableLike.scala:259)
at scala.collection.AbstractTraversable.filter(Traversable.scala:104)
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:533)
at org.apache.spark.sql.execution.datasources.DataSource.providingClass$lzycompute(DataSource.scala:89)
at org.apache.spark.sql.execution.datasources.DataSource.providingClass(DataSource.scala:89)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:304)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
... 48 elided
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.sources.v2.StreamingWriteSupportProvider
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 79 more
但是,如果我将spark shell命令中jar的顺序更改为spark shell--jars kafka_2.12-2.5.0.jar、kafka-clients-2.5.0.jar、spark-sql-kafka-0-10_2.11-2.5.0-palantir.8.jar
,则会崩溃:
java.lang.NoClassDefFoundError: org/apache/kafka/common/serialization/ByteArrayDeserializer
at org.apache.spark.sql.kafka010.KafkaSourceProvider$.<init>(KafkaSourceProvider.scala:376)
at org.apache.spark.sql.kafka010.KafkaSourceProvider$.<clinit>(KafkaSourceProvider.scala)
at org.apache.spark.sql.kafka010.KafkaSourceProvider.validateBatchOptions(KafkaSourceProvider.scala:330)
at org.apache.spark.sql.kafka010.KafkaSourceProvider.createRelation(KafkaSourceProvider.scala:113)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:309)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
... 48 elided
Caused by: java.lang.ClassNotFoundException: org.apache.kafka.common.serialization.ByteArrayDeserializer
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 55 more
java.lang.NoClassDefFoundError:org/apache/kafka/common/serialization/ByteArraydSerializer
位于org.apache.spark.sql.kafka010.KafkaSourceProvider$(KafkaSourceProvider.scala:376)
位于org.apache.spark.sql.kafka010.KafkaSourceProvider$(KafkaSourceProvider.scala)
在org.apache.spark.sql.kafka010.KafkaSourceProvider.validateBatchOptions(KafkaSourceProvider.scala:330)
位于org.apache.spark.sql.kafka010.KafkaSourceProvider.createRelation(KafkaSourceProvider.scala:113)
位于org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:309)
位于org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
位于org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:146)
... 48删去
原因:java.lang.ClassNotFoundException:org.apache.kafka.common.serialization.ByteArraydSerializer
在java.net.URLClassLoader$1.run(URLClassLoader.java:372)
在java.net.URLClassLoader$1.run(URLClassLoader.java:361)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:360)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 55多
我正在开发一个由我们的客户管理的非常严格的代理,无法使用--packages
,我在这里有点不知所措,我是否无法在shell启动时加载所有3个依赖项?我是不是又错过了一步呢?这句话的意思是:
为了在spark shell上进行实验,您需要在调用spark shell时添加上述库及其依赖项
您正在使用的库似乎是定制的,在maven中央存储库中不公开。这意味着,我不能研究它的依赖性
然而,看看最新的稳定版本
2.4.5
,根据iskafka Client
version2.0.0
,在用户应用程序和Spark本身都依赖于同一个库的情况下,偶尔会出现一个中断性问题,即处理依赖性冲突。这种情况很少出现,但一旦出现,用户可能会感到烦恼。通常,当在执行Spark作业期间引发NoSuchMethodError、ClassNotFoundException或其他与类加载相关的JVM异常时,这会表现出来。这个问题有两种解决方案。第一种方法是修改应用程序,使其依赖于Spark使用的第三方库的相同版本。第二种方法是使用一个通常被称为“着色”的过程来修改应用程序的打包。Maven构建工具通过示例7-5中所示插件的高级配置来支持着色(事实上,着色功能就是插件名为Maven shade plugin的原因)。着色允许您在不同名称空间下创建冲突包的第二个副本,并重写应用程序代码以使用重命名版本。这种蛮力技术在解决运行时依赖关系冲突方面非常有效。有关如何隐藏依赖项的具体说明,请参阅构建工具的文档
我会尝试了解spark shell的scala版本,因为这可能是scala版本的问题
scala> util.Properties.versionString
res3: String = version 2.11.8
如果没有,请检查您正在使用的spark版本以及作为依赖项使用的第三方库版本,因为我确信您的spark版本不支持最新或最旧的版本
我希望它能有所帮助。您正在尝试导入不同库的多个scala版本
2.11
和2.12
请添加相同版本的scala库,并在下面检查如何导入到spark shell
spark-shell --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.5,org.apache.kafka:kafka_2.11:2.4.1,org.apache.kafka:kafka-clients:2.4.1
嗨,迈克,谢谢你的回复-我下载了spark sql kafka 2.4.5库以及kafka Client 2.0.0,但是当我运行spark shell实例时,我得到了相同的错误,包括这两个Jarsty添加所有依赖项,这意味着也
spark标记
和spark sql
,正如我提供的链接中所述。我不高兴,添加所有依赖项仍然会产生相同的错误。作为测试,我运行了import org.apache.spark.sql.sources.v2.StreamWriteSuport
,得到的响应是对象v2不是包的成员…
为什么需要导入org.apache.spark.sql.sources.v2.StreamWriteSuport
?对于使用结构化流媒体读取来自Kafka的消息,我想您不需要这个。我只是作为测试导入了它-这是导致崩溃的缺少的类,但似乎整个对象v2不存在,而不仅仅是一个类谢谢您的回答-spark sql Kafka包针对scala 2.11版,哪个与我拥有的scala版本相匹配,2.11.8
您的build.sbt中有什么scala版本,spark shell管理什么scala版本?2.11.8
对于Botshand,在您的开发环境中它没有崩溃,是吗?请使用命令print(sc.version)检查您的spark版本在spark shell中检查匹配版本是否存在问题。