Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka Kstreams中有状态和无状态转换的区别是什么?_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka Kstreams中有状态和无状态转换的区别是什么?

Apache kafka Kstreams中有状态和无状态转换的区别是什么?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我是Kstreams的初学者,我阅读了文档,但我似乎无法理解这两者之间的区别,非常感谢用一个示例进行简单的解释。聚合和连接需要状态-通过拓扑进行的初始累加器或分组 过滤、分支、映射或迭代流不需要状态—一条消息传入,零条或一条消息传出 值得指出的是,groupBy函数被认为是无状态的OneCricketer所说的是正确的。我发布这个答案只是为了用现在的例子来解释。简而言之,有状态操作依赖于流的先前事件,而无状态操作则不依赖。以计数事件为例 StreamsBuilder builder = new

我是Kstreams的初学者,我阅读了文档,但我似乎无法理解这两者之间的区别,非常感谢用一个示例进行简单的解释。

聚合和连接需要状态-通过拓扑进行的初始累加器或分组

过滤、分支、映射或迭代流不需要状态—一条消息传入,零条或一条消息传出


值得指出的是,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
),。

感谢您提供的示例,它有助于更好地理解这个概念