У меня есть несколько искровых заданий, параллельно записывающих в кластер 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} \
Пожалуйста, предложите причину этой проблемы, и почему это работает при повторном запуске? Как я могу убедиться, что таких сбоев нет?