Kafka Stream StateStore是全球所有实例还是本地实体?

时间:2016-10-27 01:53:33

标签: apache-kafka apache-kafka-streams

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

Thnaks

3 个答案:

答案 0 :(得分:18)

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

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

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

  3. 请记住,更改日志是应用程序状态的真实,本地存储基本上是状态分片的缓存。

    此外,在WordCount示例中,记录流(数据流)通过单词进行分区,这样一个单词的计数将由单个实例维护(不同的实例保持不同单词的计数)。 / p>

    对于体系结构概述,我建议http://docs.confluent.io/current/streams/architecture.html

    此博客文章也应该很有趣http://www.confluent.io/blog/unifying-stream-processing-and-interactive-queries-in-apache-kafka/

答案 1 :(得分:3)

如果值得一提,那就是GlobalKTable improvement proposal

  

每个KafkaStreams实例将完全复制一次GlobalKTable。   也就是说,每个KafkaStreams实例都将使用该实例的所有分区   相应的主题。

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

  

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

0.10.2-rc0已经有了GlobalKTable!

这是actual PR

那个告诉我的人是Matthias J. Sax;)

答案 2 :(得分:0)

在要从GlobalStateStore查找数据的用例中,对于要在输入主题上执行的所有转换,请使用Processor而不是Transformer。使用distance = tf.sqrt( tf.pow(origin_lat - dest_lat, 2) + tf.pow(origin_lon - dest_lon, 2) ) 将数据发送到下游节点。 context.forward(key,value,childName)可能在context.forward(key,value,childName)process()中被多次调用,以便向下游节点发送多个记录。如果需要更新GlobalStateStore,请仅在传递给punctuate() Processor 中执行此操作,因为存在与GlobalStateStore相关联的GlobalStreamThread,它可以使存储状态在所有运行中保持一致kstream实例。