将Cassandra查询数据组合/更新为从Kafka收到的结构化流媒体

时间:2018-04-16 17:46:06

标签: scala apache-spark cassandra spark-structured-streaming

我正在创建一个Spark结构化流媒体应用程序,它将每隔10秒计算从Kafka收到的数据。

为了能够进行一些计算,我需要在Cassandra数据库中查找有关传感器和放置的一些信息

我几乎不知道如何保持整个群集中的Cassandra数据可用,并且不时地以某种方式更新数据,以防我们对数据库表做了一些更改。

目前,我在使用Datastax Spark-Cassandra-connector本地启动Spark后立即查询数据库

val cassandraSensorDf = spark
  .read
  .cassandraFormat("specifications", "sensors")
  .load

从这里开始,我可以使用此cassandraSensorDs加入我的结构化流数据集。

.join(
   cassandraSensorDs ,
   sensorStateDf("plantKey") <=> cassandraSensorDf ("cassandraPlantKey")
)

如何在运行结构化流式传输时执行其他查询来更新此Cassandra数据? 如何在群集设置中提供查询数据?

1 个答案:

答案 0 :(得分:2)

使用广播变量,您可以编写一个包装器来定期从Cassandra获取数据并更新广播变量。使用广播变量对流进行地图侧连接。我没有测试过这种方法,我认为根据您的使用情况(吞吐量),这可能也是一种过度杀伤力。

How can I update a broadcast variable in spark streaming?

另一种方法是查询流中每个项目的Cassandra,以优化连接,确保使用连接池并为JVM /分区仅创建一个连接。这种方法更简单,您不必担心定期加热Cassandra数据。

spark-streaming and connection pool implementation