无限流中的不同计数

kq4fsx7k  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(259)

我正在寻找一种方法来创建一个流应用程序,它可以承受每秒数百万个事件,并实时输出这些事件的不同计数。由于这个流不受任何时间窗口的限制,它显然必须有一些存储来支持。但是,我无法找到保持良好抽象级别的最佳方法(这意味着我需要一个框架来处理存储和计数,否则我根本不需要框架)。对我来说,首选的存储设备是cassandra和redis(两者都是理想的)。
我考虑过的选择是flink、spark和kafka streams。我知道他们之间的区别,但我仍然不能选择最好的解决办法。有人能给点建议吗?提前谢谢。

jckbn6z7

jckbn6z71#

我建议重新考虑一下存储系统的选择。使用外部系统要比使用本地状态慢得多。flink应用程序在本地维护jvm堆或rocksdb(磁盘)中的状态,并可以定期将其检查点指向hdfs等持久性存储。这种状态可能会变得非常大(tbs的10秒),并且仍然可以有效地维护,因为检查点可以以增量和异步方式完成。这比为每条记录向外部系统发送查询提供了更好的性能。
如果您仍然喜欢redis或cassandra,那么可以使用flink的asyncio操作符来发送异步请求,以提高应用程序的吞吐量。

zbsbpyhn

zbsbpyhn2#

不管您选择哪种解决方案,如果您能够承受它不是100%准确(但是非常接近),您可以让您的操作员使用hyperloglog(有可用的java实现)。这使得您实际上不必保留关于每个项目的数据,从而大大减少了内存使用。
假设flink的必要状态非常小(<1mb),因此可以很容易地使用 FSStateBackend 它是基于堆和文件系统的检查点,允许您减少序列化开销。
假设你和Flink一起,用 [ContinuousEventTimeTrigger][2] ,您还可以查看当前正在跟踪的唯一项的数量。

相关问题