Apache kafka 用卡夫卡流计数

Apache kafka 用卡夫卡流计数,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我有一个关于流媒体的问题,但是关于这个问题的范围,让我们用卡夫卡流来限制我们自己。让我们进一步缩小范围,把我们的问题限制在字数上,或者是一般的字数上。假设我有一个由一些键和一个值组成的流,键可以是一个字符串(假设我们可以有很多字符串,除了空字符串,由世界上的任何字符组成),值是一个整数,现在我们正在构建一个单词计数应用程序,如果词汇表中的单词总数是一万亿,我们就不能将它们存储在一些本地缓存中。如果单词w的值为x我需要将w的现有计数更新为x+x假设x是以前的计数,我将如何构建此应用程序。我无法在K

我有一个关于流媒体的问题,但是关于这个问题的范围,让我们用卡夫卡流来限制我们自己。让我们进一步缩小范围,把我们的问题限制在字数上,或者是一般的字数上。假设我有一个由一些键和一个值组成的流,键可以是一个字符串(假设我们可以有很多字符串,除了空字符串,由世界上的任何字符组成),值是一个整数,现在我们正在构建一个单词计数应用程序,如果词汇表中的单词总数是一万亿,我们就不能将它们存储在一些本地缓存中。如果单词
w
的值为
x
我需要将
w
的现有计数更新为
x+x
假设
x
是以前的计数,我将如何构建此应用程序。我无法在
KTable
或卡夫卡本地存储中存储一万亿字,我将如何构建此应用程序?我对流或它们如何工作的理解是错误的。

因为Kafka流可以水平扩展,所以您可以根据需要部署任意多的应用程序实例。因此,实际上应该可以构建此应用程序。请注意,
KTable
状态将在所有机器上分片

如果假设有一万亿个密钥,每个密钥大约有100字节,那么需要大约100 TB的存储空间。为了给一些头部空间,实际上您可能需要提供200 TB的容量。因此,每个2 TB的100个实例应该可以完成这项工作


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

因为Kafka流可以水平扩展,所以您可以部署任意数量的应用程序实例。因此,实际上应该可以构建此应用程序。请注意,
KTable
状态将在所有机器上分片

如果假设有一万亿个密钥,每个密钥大约有100字节,那么需要大约100 TB的存储空间。为了给一些头部空间,实际上您可能需要提供200 TB的容量。因此,每个2 TB的100个实例应该可以完成这项工作

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

(+1与Matthias J.Sax在回答中所说的一致。)

另一种方法是使用概率计数,它具有显著更低的存储和内存占用;i、 例如,使用概率数据结构(如CMS)代替线性数据结构(如Kafka Streams’
KTable
或Java
HashMap

有一个名为
ProbabilisticCounting
的示例演示了如何在Kafka流中使用CMS执行概率计数:(对于融合平台版本5.2.1/Apache Kafka 2.2.1)

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

(+1,与Matthias J.Sax在回答中所说的相同。)

另一种方法是使用概率计数,它具有显著更低的存储和内存占用;i、 例如,使用概率数据结构(如CMS)代替线性数据结构(如Kafka Streams’
KTable
或Java
HashMap

有一个名为
ProbabilisticCounting
的示例演示了如何在Kafka流中使用CMS执行概率计数:(对于融合平台版本5.2.1/Apache Kafka 2.2.1)


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

感谢您的回复,我不明白的是,卡夫卡以外的应用程序如何访问数据。例如,如果我要创建一个中间件服务,它希望在我的应用程序的UI中显示任何单词的计数,那么
KTable
是否会授予我该访问权限,比如我获取一个
get
请求,请求参数指定需要返回计数的单词。Kafka Streams有一个称为“交互式查询”的功能这允许您查询单个碎片并找到正确的碎片。查看文档了解详细信息:--您需要在上面构建自己的REST层(或类似层),这将公开一个
GET
。在Github上可以找到一个示例实现:感谢您的回复,我不明白的是卡夫卡以外的应用程序如何访问数据。例如,如果我要创建一个中间件服务,它希望在我的应用程序的UI中显示任何单词的计数,那么
KTable
是否会授予我该访问权限,比如我获取一个
get
请求,请求参数指定需要返回计数的单词。Kafka Streams有一个称为“交互式查询”的功能这允许您查询单个碎片并找到正确的碎片。查看文档了解详细信息:--您需要在上面构建自己的REST层(或类似层),这将公开一个
GET
。在Github上可以找到一个示例实现: