Cassandra 对时间序列数据流执行查询

Cassandra 对时间序列数据流执行查询,cassandra,apache-kafka,spark-streaming,iot,Cassandra,Apache Kafka,Spark Streaming,Iot,我正在尝试设计我的流媒体应用程序的体系结构,并为这项工作选择合适的工具 这就是它目前的工作方式: 来自“应用程序生产者”部分的消息的形式为(传感器的地址、时间戳、内容)元组 我已经实现了卡夫卡之前的所有功能,现在我遇到了设计中的主要缺陷。在“火花流”部分,合并的消息流被转换为事件流。问题在于,事件大部分是复合的——由多条消息组成,这些消息在不同的传感器上同时发生 我不能依靠“到达卡夫卡的时间”来检测“同时性”。因此,在使用Spark提取信息之前,我必须对卡夫卡中的信息进行排序。或者,更准确地说

我正在尝试设计我的流媒体应用程序的体系结构,并为这项工作选择合适的工具

这就是它目前的工作方式:

来自“应用程序生产者”部分的消息的形式为
(传感器的地址、时间戳、内容)
元组

我已经实现了卡夫卡之前的所有功能,现在我遇到了设计中的主要缺陷。在“火花流”部分,合并的消息流被转换为事件流。问题在于,事件大部分是复合的——由多条消息组成,这些消息在不同的传感器上同时发生

我不能依靠“到达卡夫卡的时间”来检测“同时性”。因此,在使用Spark提取信息之前,我必须对卡夫卡中的信息进行排序。或者,更准确地说,对卡夫卡的信息进行查询

也许卡桑德拉是卡夫卡的正确替代者?我有一个非常简单的数据模型,并且只需要执行两种可能的查询类型:按地址查询和按时间戳范围查询。也许这是正确的选择


有人有卡桑德拉的吞吐量吗

如果您想在时间序列上运行查询,Cassandra可能是最合适的-它非常适合写优化,您可以为序列构建“宽”行。可以在宽行上进行切片,因此只需一个查询即可选择一些时间范围


另一方面,卡夫卡可以被视为一个原始数据流——您没有查询,只有最近生成的数据。为了基于同一分区中的某个键收集数据,必须仔细选择该键。同一分区内的所有数据都是按时间排序的。

时间戳范围查询是cassandra的经典用例,如果您还需要基于地址的查询,那么如果使用cassandra,您必须将它们作为集群列。就cassandra吞吐量而言,如果您可以在cassandra集群上进行适当的性能分析,那么您可以获得非常高的写入吞吐量。但是我使用了SparkQL、Cassandra驱动程序和spark Cassandra连接器,它们在拥有一个具有高CPU配置的大型集群之前并不能提供高的查询吞吐量,它不能很好地处理小数据集


Kafka不应该用作查询的数据源,它更多的是提交日志

如果我创建了很多主题,在Kafka中topic=address会怎么样?行吗?然后我可以对到达时间与
时间戳的值相比的“不正确性”做出一些假设,并完全放弃地址查询。@mkurnikov很多话题可能不是一个好主意。但您可以为数据创建一个主题,并选择地址字段作为键。在这种情况下,具有相同地址的所有事件都将进入同一分区并进行时间排序。您甚至可以使用单个分区创建一个主题,并将所有事件存储在该分区中。在这种情况下,您可以对所有事件进行排序,但吞吐量会很差。我应该清除来自Cassandra的已用消息吗?这也会影响性能。在Kafka,AFAIK的例子中,队列中有多少数据实际上并不重要,因为它是底层数据模型。。它创建了墓碑,墓碑在压缩过程中产生了高cpu使用率。。所以我不建议使用cassandra删除或清理数据。