Spark流媒体不会向Cassandra

时间:2016-03-30 16:14:42

标签: apache-spark cassandra spark-streaming spark-cassandra-connector

我有以客户端模式工作的火花流代码:它从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()

3 个答案:

答案 0 :(得分:1)

您需要确保工作人员可以使用您的JAR。一旦作业执行开始,spark master将打开文件服务器。

您需要使用SparkContext.setJars或通过传递给--jars的{​​{1}}标记来指定优步罐的路径。

From the documentation

  

使用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的一部分,因此该错误。