用Kafka Streams计数

时间:2019-04-17 18:17:39

标签: apache-kafka apache-kafka-streams

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

2 个答案:

答案 0 :(得分:4)

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

如果假设使用一万亿个密钥,并且每个密钥约为100个字节,则将需要约100 TB的存储空间。要留出一些空间,实际上,您可能需要配置200 TB。因此,100个实例,每个实例2 TB,应该可以完成这项工作。

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

答案 1 :(得分:0)

(对Matthias J. Sax在回答中说的话+1。)

另一种方法是使用概率计数,这大大降低了存储和内存占用;即使用Count-min Sketch(CMS)之类的概率数据结构代替Kafka Streams的KTable或Java HashMap之类的线性数据结构。

有一个名为ProbabilisticCounting的示例,它演示了如何在Kafka Streams中使用CMS执行概率计数:https://github.com/confluentinc/kafka-streams-examplesdirect link对于Confluent Platform版本5.2.1 / Apache Kafka 2.2。 1)

我已经成功地将概率计数用于键空间很大(在您的情况下为数万亿个键)的类似用例中。