我正在尝试让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代码后我需要清理某些东西才能再次工作。
答案 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"