Kafka Stream StateStore 是在所有实例上全局还是仅在本地?
Is Kafka Stream StateStore global over all instances or just local?
在 Kafka Stream WordCount
示例中,它使用 StateStore
来存储字数。如果同一个消费者组中有多个实例,StateStore
对组来说是全局的,还是对消费者实例来说只是局部的?
谢谢
这取决于您对 state store 的看法。
在 Kafka Streams 中,状态是共享的,因此每个实例都持有整个应用程序状态的一部分。例如,使用 DSL 有状态运算符使用本地 RocksDB 实例来保存其状态分片。因此,在这方面,状态是本地的。
另一方面,所有对状态的更改都写入到 Kafka 主题中。本主题不"live"在应用主机上,而是在Kafka集群中,由多个分区组成,可以复制。如果出现错误,此更改日志主题用于在另一个仍然 运行 的实例中重新创建失败实例的状态。因此,由于所有应用程序实例都可以访问更改日志,因此它也可以被认为是全局的。
请记住,更改日志是应用程序状态的真相,本地存储基本上是状态分片的缓存。
此外,在 WordCount 示例中,记录流(数据流)按单词进行分区,这样一个单词的计数将由单个实例维护(不同的实例维护不同单词的计数) .
对于架构概述,我推荐 http://docs.confluent.io/current/streams/architecture.html
另外这个博客 post 应该很有趣 http://www.confluent.io/blog/unifying-stream-processing-and-interactive-queries-in-apache-kafka/
如果值得一提的是有一个GlobalKTable improvement proposal
GlobalKTable will be fully replicated once per KafkaStreams instance.
That is, each KafkaStreams instance will consume all partitions of the
corresponding topic.
从 Confluent Platform 的邮件列表中,我得到了这些信息
You could start
prototyping using Kafka 0.10.2 (or trunk) branch...
0.10.2-rc0 已经有 GlobalKTable!
这是 actual PR。
告诉我的人是 Matthias J. Sax ;)
只要有从 GlobalStateStore 中查找数据的用例,对要对输入主题执行的所有转换,请使用处理器而不是转换器。使用 context.forward(key,value,childName)
将数据发送到下游节点。 context.forward(key,value,childName)
可以在 process()
和 punctuate()
中多次调用,从而向下游节点发送多条记录。如果需要更新 GlobalStateStore,请仅在传递给 addGlobalStore(..)
的 Processor 中执行此操作,因为有一个与 GlobalStateStore 关联的 GlobalStreamThread,它使存储的状态在整个过程中保持一致所有 运行 个 kstream 实例。
在 Kafka Stream WordCount
示例中,它使用 StateStore
来存储字数。如果同一个消费者组中有多个实例,StateStore
对组来说是全局的,还是对消费者实例来说只是局部的?
谢谢
这取决于您对 state store 的看法。
在 Kafka Streams 中,状态是共享的,因此每个实例都持有整个应用程序状态的一部分。例如,使用 DSL 有状态运算符使用本地 RocksDB 实例来保存其状态分片。因此,在这方面,状态是本地的。
另一方面,所有对状态的更改都写入到 Kafka 主题中。本主题不"live"在应用主机上,而是在Kafka集群中,由多个分区组成,可以复制。如果出现错误,此更改日志主题用于在另一个仍然 运行 的实例中重新创建失败实例的状态。因此,由于所有应用程序实例都可以访问更改日志,因此它也可以被认为是全局的。
请记住,更改日志是应用程序状态的真相,本地存储基本上是状态分片的缓存。
此外,在 WordCount 示例中,记录流(数据流)按单词进行分区,这样一个单词的计数将由单个实例维护(不同的实例维护不同单词的计数) .
对于架构概述,我推荐 http://docs.confluent.io/current/streams/architecture.html
另外这个博客 post 应该很有趣 http://www.confluent.io/blog/unifying-stream-processing-and-interactive-queries-in-apache-kafka/
如果值得一提的是有一个GlobalKTable improvement proposal
GlobalKTable will be fully replicated once per KafkaStreams instance. That is, each KafkaStreams instance will consume all partitions of the corresponding topic.
从 Confluent Platform 的邮件列表中,我得到了这些信息
You could start prototyping using Kafka 0.10.2 (or trunk) branch...
0.10.2-rc0 已经有 GlobalKTable!
这是 actual PR。
告诉我的人是 Matthias J. Sax ;)
只要有从 GlobalStateStore 中查找数据的用例,对要对输入主题执行的所有转换,请使用处理器而不是转换器。使用 context.forward(key,value,childName)
将数据发送到下游节点。 context.forward(key,value,childName)
可以在 process()
和 punctuate()
中多次调用,从而向下游节点发送多条记录。如果需要更新 GlobalStateStore,请仅在传递给 addGlobalStore(..)
的 Processor 中执行此操作,因为有一个与 GlobalStateStore 关联的 GlobalStreamThread,它使存储的状态在整个过程中保持一致所有 运行 个 kstream 实例。