在Kafka Stream WordCount
示例中,它使用StateStore
来存储字数。如果同一个使用者组中有多个实例,StateStore
对于该组是全局的,还是仅对于消费者实例是本地的?
Thnaks
答案 0 :(得分:18)
这取决于您对州商店的看法。
在Kafka Streams中,共享一个状态,因此每个实例都包含整个应用程序状态的一部分。例如,使用DSL有状态运算符使用本地RocksDB实例来保存其状态的分片。因此,在这方面,国家是当地的。
另一方面,对状态的所有更改都写入Kafka主题。这个主题没有"生活"在应用程序主机上,但在Kafka集群中,由多个分区组成,可以复制。如果出现错误,此changelog主题用于在另一个仍在运行的实例中重新创建失败实例的状态。因此,由于所有应用程序实例都可以访问更改日志,因此也可以认为它是全局的。
请记住,更改日志是应用程序状态的真实,本地存储基本上是状态分片的缓存。
此外,在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实例。