在无限流中计数明显

时间:2018-03-13 11:00:31

标签: apache-spark count stream apache-kafka apache-flink

我正在寻找一种方法来创建一个流媒体应用程序,它可以承受每秒数百万个事件,并实时输出这些事件的独特计数。由于此流在任何时间窗口都不受限制,因此显然必须由某个存储支持。但是,我找不到保持良好抽象级别的最佳方法(这意味着我想要一个框架来处理存储和计数,否则我根本不需要框架)。对我来说,首选的存储空间是Cassandra和Redis(理想情况下)。

我考虑的选项是Flink,Spark和Kafka Streams。我知道他们之间的差异,但我仍然无法选择最佳解决方案。有人可以建议吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

无论您选择哪种解决方案,如果您能够承受它不是100%准确(但非常接近),您可以让您的运营商使用HyperLogLog(有可用的Java实现)。这使您实际上不必保留有关每个项目的数据,从而大大减少您的内存使用量。

假设Flink,必要的状态非常小(<1MB),因此可以轻松地使用基于堆的FSStateBackend和检查点到文件系统,从而减少序列化开销。

再次假设您使用Flink,使用[ContinuousEventTimeTrigger][2],您还可以查看当前正在跟踪的唯一项目数。

答案 1 :(得分:2)

我建议重新考虑存储系统的选择。使用外部系统比使用本地状态要慢得多。 Flink应用程序在本地维护JVM堆或RocksDB(在磁盘上)上的状态,并且可以定期检查它到持久性存储(如HDFS)。这种状态可以变得非常大(TB的10s)并且仍然可以有效地维护,因为检查点可以递增地和异步地完成。这比为每个记录向外部系统发送查询提供了更好的性能。

如果您仍然喜欢Redis或Cassandra,可以使用Flink的AsyncIO运算符发送异步请求,以提高应用程序的吞吐量。