用卡夫卡流计数



我对一般的流媒体有一个问题,但对于问题的范围,让我们限制自己使用 Kafka Streams。让我们进一步缩小范围,将我们的问题限制在字数统计上,或者一般地计算。假设我有一个包含某个键和一个值的流,键可能是一个字符串(假设我们可以有很多字符串,除了空字符串,由世界上的任何字符组成(并且值是一个整数,现在我们正在构建一个字数统计应用程序,如果词汇中的单词总数是一万亿,我们不能将它们存储在某个本地缓存中。如果看到带有值的单词w x我需要更新w的现有计数以X+x假设X是以前的计数,我将如何构建此应用程序。我无法在 KTable 或 Kafka 原生的任何其他本地存储中存储一万亿个单词,我将如何构建此应用程序?我对流或其工作方式的理解是错误的吗?

由于 Kafka Streams 是水平扩展的,因此您可以根据需要部署任意数量的应用程序实例。因此,实际上应该可以构建此应用程序。请注意,KTable状态将在所有计算机上分片。

如果您假设有一万亿个密钥,并且每个密钥大约是 100 字节,则需要大约 100 TB 的存储空间。为了提供一些空间,实际上您可能需要预配 200 TB。因此,100 个实例(每个实例 2 TB(应该可以完成这项工作。

为此,您的输入主题需要有 100 个分区,这对 Kafka 来说不是问题。

(+1 到 Matthias J. Sax 在他的回答中所说的。

另一种方法是使用概率计数,它具有显着较低的存储和内存占用;即,使用像Count-min Sketch(CMS(这样的概率数据结构,而不是像Kafka Streams的KTable或Java HashMap这样的线性数据结构。

有一个名为ProbabilisticCounting的示例,演示了如何在Kafka Streams中使用CMS执行概率计数:https://github.com/confluentinc/kafka-streams-examples(Confluent Platform 版本 5.2.1/Apache Kafka 2.2.1 的直接链接(

我已经成功地将概率计数用于密钥空间非常大的类似用例(在您的情况下:数万亿个密钥(。

相关内容

  • 没有找到相关文章

最新更新