【问题标题】:Is Kafka Stream StateStore global over all instances or just local?Kafka Stream StateStore 在所有实例上是全局的还是只是本地的?
【发布时间】:2017-03-09 13:31:56
【问题描述】:

在 Kafka Stream WordCount 示例中,它使用 StateStore 来存储字数。如果同一个消费者组中有多个实例,StateStore 对于组来说是全局的,还是只是消费者实例的本地?

感谢

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

    每当有从 GlobalStateStore 查找数据的用例时,对于要对输入主题执行的所有转换,使用处理器而不是转换器。使用context.forward(key,value,childName) 将数据发送到下游节点。 context.forward(key,value,childName) 可以在 process()punctuate() 中多次调用,从而向下游节点发送多条记录。如果需要更新 GlobalStateStore,请仅在传递给 addGlobalStore(..)Processor 中执行此操作,因为有一个与 GlobalStateStore 关联的 GlobalStreamThread,它使存储的状态在所有正在运行的 kstream 实例中保持一致.

    【讨论】:

      【解决方案2】:

      这取决于您对国有商店的看法。

      1. 在 Kafka Streams 中,状态是共享的,因此每个实例都包含整个应用程序状态的一部分。例如,使用 DSL 有状态操作符使用本地 RocksDB 实例来保存他们的状态分片。因此,在这方面,州是地方的。

      2. 另一方面,对状态的所有更改都写入到 Kafka 主题中。该主题不在应用程序主机上“生活”,而是在 Kafka 集群中,由多个分区组成,可以复制。如果发生错误,此更改日志主题用于在另一个仍在运行的实例中重新创建失败实例的状态。因此,由于所有应用程序实例都可以访问更改日志,因此它也可以被认为是全局的。

      请记住,变更日志是应用程序状态的真相,而本地存储基本上是状态分片的缓存。

      此外,在 WordCount 示例中,记录流(数据流)按单词划分,这样一个单词的计数将由单个实例维护(不同的实例维护不同单词的计数)。

      对于架构概述,我推荐http://docs.confluent.io/current/streams/architecture.html

      另外这篇博文应该很有趣http://www.confluent.io/blog/unifying-stream-processing-and-interactive-queries-in-apache-kafka/

      【讨论】:

      • @MatthiasJ.Sax 很好的答案,+1。这个变更日志主题有多少个分区?
      • 我们为每个分片创建一个分区。这取决于输入主题分区的数量。如果您使用具有 5 个分区的单个输入主题,我们会创建 5 个分片,因此更改日志主题也有 5 个分区。
      • 发布到“streams-plaintext-input”的消息带有一个空键和句子作为值。在这种情况下,任何一个实例都可以获得消息。如果每个实例都保留一个单词的计数,如何计算有效计数?
      • 您需要将每个句子拆分为单词,将单词作为关键字,然后计数:github.com/apache/kafka/blob/trunk/streams/examples/src/main/…(即,数据将根据单词重新分配,以确保最终出现相同的单词在同一实例上。)
      • .groupBy((key, value) -> value) 只设置一个新密钥;保留现有值(未设置为null)。是的,数据被写入内部重新分区主题。是的,在重新分区主题被下游消费之后发生计数。是的,重新分区主题与输入主题的分区数相同。
      【解决方案3】:

      如果值得一提的是有一个GlobalKTable improvement proposal

      GlobalKTable 将在每个 KafkaStreams 实例中完全复制一次。 也就是说,每个 KafkaStreams 实例都会消耗 对应的话题。

      从 Confluent 平台的邮件列表中,我得到了这些信息

      你可以开始 使用 Kafka 0.10.2(或主干)分支进行原型设计...

      0.10.2-rc0 已经有了 GlobalKTable!

      这是actual PR

      告诉我的人是马蒂亚斯·J·萨克斯;)

      【讨论】:

        猜你喜欢
        • 2012-07-03
        • 2018-04-13
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 2023-01-21
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        相关资源
        最近更新 更多