我正在创建一个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数据? 如何在群集设置中提供查询数据?
答案 0 :(得分:2)
使用广播变量,您可以编写一个包装器来定期从Cassandra获取数据并更新广播变量。使用广播变量对流进行地图侧连接。我没有测试过这种方法,我认为根据您的使用情况(吞吐量),这可能也是一种过度杀伤力。
How can I update a broadcast variable in spark streaming?
另一种方法是查询流中每个项目的Cassandra,以优化连接,确保使用连接池并为JVM /分区仅创建一个连接。这种方法更简单,您不必担心定期加热Cassandra数据。