In Kafka Stream WordCount
example, it uses StateStore
to store word counts. If there are multiple instances in the same consumer group, the StateStore
is global to the group, or just local to an consumer instance?
Thnaks
In Kafka Stream WordCount
example, it uses StateStore
to store word counts. If there are multiple instances in the same consumer group, the StateStore
is global to the group, or just local to an consumer instance?
Thnaks
这取决于您对国营商店的看法。
在 Kafka Streams 中,状态是共享的,因此每个实例都包含整个应用程序状态的一部分。例如,使用 DSL 有状态操作符使用本地 RocksDB 实例来保存他们的状态分片。因此,在这方面,国家是地方性的。
另一方面,对状态的所有更改都写入到 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/
如果值得一提的是有一个GlobalKTable 的改进建议
GlobalKTable 将在每个 KafkaStreams 实例中完全复制一次。即每个 KafkaStreams 实例都会消费对应主题的所有分区。
从 Confluent 平台的邮件列表中,我得到了这些信息
您可以使用 Kafka 0.10.2(或主干)分支开始原型设计...
0.10.2-rc0 已经有了 GlobalKTable!
这是实际的 PR。
告诉我的人是 Matthias J. Sax ;)
每当有从 GlobalStateStore 查找数据的用例时,对于要对输入主题执行的所有转换,使用处理器而不是转换器。用于context.forward(key,value,childName)
将数据发送到下游节点。context.forward(key,value,childName)
可以在一个process()
and中多次调用punctuate()
,从而向下游节点发送多条记录。如果需要更新 GlobalStateStore,请仅在传递给的处理器addGlobalStore(..)
中执行此操作,因为有一个与 GlobalStateStore 关联的 GlobalStreamThread,它使存储的状态在所有运行的 kstream 实例中保持一致。