【问题标题】:Counting with Kafka Streams使用 Kafka Streams 计数
【发布时间】:2019-04-17 18:17:38
【问题描述】:

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

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复,我不明白的是,Kafka 之外的应用程序如何访问数据。例如如果我要创建一个中间件服务,它想在我的应用程序的 UI 中显示任何单词的计数,KTable 会授予我该访问权限,比如说我得到一个带有请求参数的GET 请求,指定一个单词的计数需要退货。
    • Kafka Streams 有一个称为“交互式查询”的功能,允许您查询各个分片并找到正确的分片。查看文档以获取详细信息:docs.confluent.io/current/streams/developer-guide/…——您需要在顶部构建自己的 REST 层(或类似层),但会暴露 GET。可以在 Github 上找到示例实现:github.com/confluentinc/kafka-streams-examples
    【解决方案2】:

    (对 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)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2018-06-14
      • 1970-01-01
      • 2019-03-30
      • 2018-08-24
      • 2020-04-25
      • 1970-01-01
      相关资源
      最近更新 更多