java .lang.NoClassDefFoundError: org / apache / spark / sq / sources / v2 / StreamingWriteSupportProvider пытается вытащить из kafka topi c в scala - PullRequest
1 голос
/ 26 мая 2020

Я использую экземпляр spark-shell, чтобы проверить получение данных из клиентского источника kafka. Для запуска экземпляра я использую команду spark-shell --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 (все банки присутствуют в рабочем каталоге).

Однако, когда я запускаю команду 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 на 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

Я разрабатываю за очень строгим прокси управляется нашим клиентом, и вместо этого я не могу использовать --packages, и я немного растерялся, не могу ли я загрузить все 3 зависимости при запуске оболочки? Я где-то пропустил еще один шаг?

Ответы [ 3 ]

2 голосов
/ 26 мая 2020

В Structured Streaming + Kafka Integration Guide написано:

Для экспериментов с Spark-shell вам нужно добавить эту вышеуказанную библиотеку и ее зависимости при вызове Spark -shell.

Кажется, что используемая вами библиотека настроена и не является общедоступной в центральном репозитории maven. Это означает, что я не могу изучить его зависимости.

Однако, глядя на последнюю стабильную версию 2.4.5, зависимости в соответствии с центральным репозиторием maven это kafka-clients версия 2.0.0.

1 голос
/ 26 мая 2020

Одна иногда мешающая проблема связана с конфликтами зависимостей в случаях, когда пользовательское приложение и сам Spark зависят от одной и той же библиотеки. Это случается относительно редко, но когда это происходит, это может раздражать пользователей. Обычно это проявляется, когда во время выполнения задания Spark возникает исключение NoSuchMethodError, ClassNotFoundException или какое-либо другое исключение JVM, связанное с загрузкой класса. Есть два решения этой проблемы. Первый - изменить ваше приложение, чтобы оно зависело от той же версии сторонней библиотеки, что и Spark. Второй - изменить упаковку вашего приложения с помощью процедуры, которую часто называют «затенением». Инструмент сборки Maven поддерживает затенение за счет расширенной конфигурации подключаемого модуля, показанного в примере 7-5 (фактически, именно благодаря возможности затенения подключаемый модуль назван maven-shade-plugin). Затенение позволяет вам сделать вторую копию конфликтующего пакета в другом пространстве имен и переписать код вашего приложения для использования переименованной версии. Этот метод грубой силы весьма эффективен при разрешении конфликтов зависимостей во время выполнения. Для конкретных c инструкций о том, как затенять зависимости, см. Документацию к вашему инструменту сборки.

Я бы попытался узнать scala версию искровой оболочки, потому что это может быть scala проблема с версией

scala> util.Properties.versionString
res3: String = version 2.11.8

если нет, то проверьте, какую версию Spark вы используете, и версии сторонних библиотек, которые вы используете в качестве зависимостей, потому что, я уверен, есть самые новые или самые старые, которые ваша версия Spark не поддержка.

Надеюсь, это поможет.

0 голосов
/ 26 мая 2020

Вы пытаетесь импортировать несколько 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

...