Apache kafka Kstreams中有状态和无状态转换的区别是什么?
我是Kstreams的初学者,我阅读了文档,但我似乎无法理解这两者之间的区别,非常感谢用一个示例进行简单的解释。聚合和连接需要状态-通过拓扑进行的初始累加器或分组 过滤、分支、映射或迭代流不需要状态—一条消息传入,零条或一条消息传出Apache kafka Kstreams中有状态和无状态转换的区别是什么?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我是Kstreams的初学者,我阅读了文档,但我似乎无法理解这两者之间的区别,非常感谢用一个示例进行简单的解释。聚合和连接需要状态-通过拓扑进行的初始累加器或分组 过滤、分支、映射或迭代流不需要状态—一条消息传入,零条或一条消息传出 值得指出的是,groupBy函数被认为是无状态的OneCricketer所说的是正确的。我发布这个答案只是为了用现在的例子来解释。简而言之,有状态操作依赖于流的先前事件,而无状态操作则不依赖。以计数事件为例 StreamsBuilder builder = new
值得指出的是,groupBy函数被认为是无状态的OneCricketer所说的是正确的。我发布这个答案只是为了用现在的例子来解释。简而言之,
有状态
操作依赖于流的先前事件,而无状态
操作则不依赖。以计数事件为例
StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> stream = builder.stream(INPUT_TOPIC);
KTable<String, Count> aggregate = stream
.peek((key, value) -> log.info("received key: {}, value: {}", key, value))
.filter((key, value) -> /* filter events with value is ____ */)
.groupByKey()
.aggregate(new Initializer<Count>() {
@Override
public Count apply() {
return new Count("", 0);
}
}, new Aggregator<String, String, Count>() {
@Override
public Count apply(String k, String v, Count aggKeyCount) {
Integer currentCount = aggKeyCount.getCount();
return new Count(k, currentCount + 1);
}
});
aggregate.toStream()
.map((k,v) -> new KeyValue<>(k, v.getCount()))
.peek((key, value) -> log.info("emitting key: {}, value: {}", key, value))
.to(COUNTS_TOPIC, Produced.with(Serdes.String(), Serdes.Integer()));
StreamsBuilder builder=newstreamsbuilder();
KStream stream=builder.stream(输入主题);
K表聚合=流
.peek((键,值)->log.info(“收到的键:{},值:{},键,值))
.filter((键,值)->/*筛选值为__*/)的事件
.groupByKey()
.aggregate(新初始值设定项(){
@凌驾
公共计数应用(){
返回新计数(“,0);
}
},新聚合器(){
@凌驾
应用公共计数(字符串k、字符串v、计数aggKeyCount){
整数currentCount=aggKeyCount.getCount();
返回新计数(k,currentCount+1);
}
});
聚合.toStream()
.map((k,v)->新的键值(k,v.getCount())
.peek((键,值)->log.info(“发出键:{},值:{},键,值))
.to(COUNTS_TOPIC,producted.with(Serdes.String(),Serdes.Integer());
操作groupByKey
,aggregate
,filter
,map
以某种方式转换事件(peek
不转换事件)。转换groupByKey
、filter
和map
是无状态的,因为它们可能会修改它们正在处理的当前事件(它们不关心以前的事件)。aggregate
转换正在计算事件的数量,因此它将它们相加。因此,这取决于以前的事件。并不是说它有一个初始值设定项的计数(“,0)
,它在计数(k,currentCount+1)
上一个接一个地聚合事件,这是基于前面的计数器aggKeyCount
此外,无状态
和有状态
的概念不在卡夫卡的KStream
中。它位于所有处理引擎上,如Hadoop MapReduce、Apache Storm。它也出现在任何处理管道上,例如Java流(例如:map
,reduce
,flatmap
,filter
),。感谢您提供的示例,它有助于更好地理解这个概念