我有以客户端模式工作的火花流代码:它从kafka读取数据,进行一些处理,并使用spark-cassandra-connector将数据插入cassandra。
当我使用“--deploy-mode cluster”时,数据不会被插入,我收到以下错误:
线程中的异常“streaming-job-executor-53”java.lang.NoClassDefFoundError:com / datastax / spark / connector / ColumnSelector at com.enerbyte.spark.jobs.wattiopipeline.WattiopipelineStreamingJob $$ anonfun $ main $ 2.apply(WattiopipelineStreamingJob.scala:94) at com.enerbyte.spark.jobs.wattiopipeline.WattiopipelineStreamingJob $$ anonfun $ main $ 2.apply(WattiopipelineStreamingJob.scala:88) 在org.apache.spark.streaming.dstream.ForEachDStream $$ anonfun $ 1 $$ anonfun $ apply $ mcV $ sp $ 1.apply $ mcV $ sp(ForEachDStream.scala:50) 在org.apache.spark.streaming.dstream.ForEachDStream $$ anonfun $ 1 $$ anonfun $ apply $ mcV $ sp $ 1.apply(ForEachDStream.scala:50) 在org.apache.spark.streaming.dstream.ForEachDStream $$ anonfun $ 1 $$ anonfun $ apply $ mcV $ sp $ 1.apply(ForEachDStream.scala:50) 在org.apache.spark.streaming.dstream.DStream.createRDDWithLocalProperties(DStream.scala:426) 在org.apache.spark.streaming.dstream.ForEachDStream $$ anonfun $ 1.apply $ mcV $ sp(ForEachDStream.scala:49) 在org.apache.spark.streaming.dstream.ForEachDStream $$ anonfun $ 1.apply(ForEachDStream.scala:49) 在org.apache.spark.streaming.dstream.ForEachDStream $$ anonfun $ 1.apply(ForEachDStream.scala:49) 在scala.util.Try $ .apply(Try.scala:161) 在org.apache.spark.streaming.scheduler.Job.run(Job.scala:39) 在org.apache.spark.streaming.scheduler.JobScheduler $ JobHandler $$ anonfun $ run $ 1.apply $ mcV $ sp(JobScheduler.scala:224) 在org.apache.spark.streaming.scheduler.JobScheduler $ JobHandler $$ anonfun $ run $ 1.apply(JobScheduler.scala:224) 在org.apache.spark.streaming.scheduler.JobScheduler $ JobHandler $$ anonfun $ run $ 1.apply(JobScheduler.scala:224) 在scala.util.DynamicVariable.withValue(DynamicVariable.scala:57) 在org.apache.spark.streaming.scheduler.JobScheduler $ JobHandler.run(JobScheduler.scala:223) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:745) 引起:java.lang.ClassNotFoundException:com.datastax.spark.connector.ColumnSelector at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在java.lang.ClassLoader.loadClass(ClassLoader.java:357)
我为这样的连接器添加了依赖性:
“com.datastax.spark”%%“spark-cassandra-connector”%“1.5.0”%“提供”
这是我的应用程序代码:
val measurements = KafkaUtils.createDirectStream[
Array[Byte],
Array[Byte],
DefaultDecoder,
DefaultDecoder](ssc, kafkaConfig, Set("wattio"
))
.map {
case (k, v) => {
val decoder = new AvroDecoder[WattioMeasure](null,
WattioMeasure.SCHEMA$)
decoder.fromBytes(v)
}
}
//inserting into WattioRaw
WattioFunctions.run(WattioFunctions.
processWattioRaw(measurements))(
(rdd: RDD[
WattioTenantRaw], t: Time) => {
rdd.cache()
//get all the different tenants
val differentTenants = rdd.map(a
=> a.tenant).distinct().collect()
// for each tenant, create keyspace value and flush to cassandra
differentTenants.foreach(tenant => {
val keyspace = tenant + "_readings"
rdd.filter(a => a.tenant == tenant).map(s => s.wattioRaw).saveToCassandra(keyspace, "wattio_raw")
})
rdd.unpersist(true)
}
)
ssc.checkpoint("/tmp")
ssc.start()
ssc.awaitTermination()
答案 0 :(得分:1)
您需要确保工作人员可以使用您的JAR。一旦作业执行开始,spark master将打开文件服务器。
您需要使用SparkContext.setJars
或通过传递给--jars
的{{1}}标记来指定优步罐的路径。
使用spark-submit时,应用程序jar以及--jars选项中包含的任何jar都将自动传输到群集。 Spark使用以下URL方案来允许传播jar的不同策略
答案 1 :(得分:0)
实际上我通过移除"提供了#34;在依赖列表中,以便sbt将spark-cassandra-connector打包到我的程序集jar中。
有趣的是,在我的启动脚本中,即使我尝试使用
spark-submit --repositories"我的神器库的位置" - 包" spark-cassandra-connector"
或
spark-submit --jars" spark-cassandra-connector.jar"
他们都失败了!
答案 2 :(得分:0)
范围提供意味着,您希望JDK或容器在运行时提供依赖关系,并且该特定依赖关系jar不会是您正在创建的最终应用程序War / jar的一部分,因此该错误。