不能用akka获取CassandraTableScanRDD

时间:2019-05-01 13:48:32

标签: scala apache-spark apache-spark-sql akka spark-cassandra-connector

我正在尝试让Akka使用API​​。入口点之一将从我的Cassandra数据库返回数据。所以我可以像这样获取我的CassandraTableScanRDD:

val spark = SparkSession
    .builder()
    .appName("Spark Cassandra")
    .config("spark.cores.max", "5")
    .config("spark.sql.warehouse.dir", "/tmp")
    .config("spark.cassandra.connection.host", "localhost")
    .config("spark.cassandra.connection.port", "9042")
    .master("local[*]")
    .getOrCreate()

  val connector = CassandraConnector.apply(spark.sparkContext.getConf)
  val sc = spark.sparkContext
  val temp = sc.cassandraTable("scala_firemen", "firemen")

  temp.foreach(println)

使用此代码,我可以获得所需的所有数据。但是,一旦添加我的Akka代码,就无法再打印/访问数据了。即使我回滚并删除Akka代码,我仍然会编码相同的错误,即:

  

[错误](运行main-0)java.lang.ExceptionInInitializerError

     

[错误] java.lang.ExceptionInInitializerError

     

[错误] org.apache.spark.rdd.RDD.withScope(RDD.scala:362)

     

[错误] org.apache.spark.rdd.RDD.first(RDD.scala:1367)

     

[错误] main $ .delayedEndpoint $ main $ 1(Server.scala:34)

     

[error] at main $ delayedInit $ body.apply(Server.scala:15)

     

...

     

ERROR ContextCleaner:清理线程时发生错误

     

...

     

ERROR Utils:线程SparkListenerBus中未捕获的错误,停止了SparkContext

     

...

     

错误实用程序:在线程SparkListenerBus中引发未捕获的致命错误

     

...

当我重新创建一个项目时,代码又可以工作了,所以我怀疑在删除Akka代码后我需要清理某些东西才能再次工作。

2 个答案:

答案 0 :(得分:2)

RDD被设计为可与Spark一起使用,因此根本无法在StreamingContext中使用它...

对于Akka应用程序,您需要Java driver directly,即使在这种情况下,也不需要执行完整的数据扫描-仅当分区键最少时,才可以快速访问数据。 ..如果仍然需要执行全面扫描,那么最好使用this之类的东西-Spark使用类似的方法进行数据扫描,但是您无需链接其所有库。

我建议您先介绍一下Cassandra的工作原理,例如通过courses on DataStax Academy-他们将解释您如何访问数据等。

答案 1 :(得分:1)

好吧,我发现我无法像所有的spark依赖项那样拥有"com.typesafe.play" %% "play-json"依赖项:

"org.apache.spark" %% "spark-sql" % "2.1.1",
"org.apache.spark" %% "spark-streaming" % "2.1.1",
"com.datastax.spark" %% "spark-cassandra-connector" % "2.0.10"