Получение ClassNotFoundException Не удалось найти источник данных при подключении к кассандре (запись) - PullRequest
0 голосов
/ 16 апреля 2020

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

java.lang.ClassNotFoundException: Failed to find data source: org.apache.spark.sql.cassandra. Please find packages at http://spark.apache.org/third-party-projects.html
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:635)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:241)
    at my.code.CassandraWriter$.writeDataframeToDC(CassandraWriter.scala:43)
    at my.code.CassandraWriter$.writeDataframe(CassandraWriter.scala:18)
    at scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach_quick(ParArray.scala:143)
    at scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach(ParArray.scala:136)
    at scala.collection.parallel.ParIterableLike$Foreach.leaf(ParIterableLike.scala:972)
    at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:49)
    at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:48)
    at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:48)
    at scala.collection.parallel.Task$class.tryLeaf(Tasks.scala:51)
    at scala.collection.parallel.ParIterableLike$Foreach.tryLeaf(ParIterableLike.scala:969)
    at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask$class.compute(Tasks.scala:152)
    at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:443)
    at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.java:160)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.cassandra.DefaultSource
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
    at scala.util.Try$.apply(Try.scala:192)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
    at scala.util.Try.orElse(Try.scala:84)
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:618)

Фляга моего проекта не является полной флягой. Флажок зависимости datastax доступен в двух каталогах в кластере cloudera:

1. myProject/artifact/distributedLibs/spark-cassandra-connector_2.11-2.3.0.jar
2. myProject/artifact/lib/com.datastax.spark.spark-cassandra-connector_2.11-2.3.0.jar

Идея состоит в том, что только фляги папок распределенных библиотек распространяются по узлу кластера, и все фляги папок lib добавляются в classpath во время spark-submit. Это должно уменьшить пространство, необходимое рабочим каталогам заданий Spark на узлах кластера.

Моя команда spark-submit выглядит следующим образом:

sparks-submit
    --jars "${distributedLib_classpath}" \
    --driver-class-path /etc/hbase/conf:$JARS:${appLib_classpath} \
    --conf spark.executor.extraClassPath=/etc/hbase/conf/:${appLib_classpath} \

Пожалуйста, предложите причину этой проблемы, и почему это работает при повторном запуске? Как я могу убедиться, что таких сбоев нет?

...