Flink 流媒体,'sum'到底是做什么的?



我在理解流方面有困难,以工作计数为例,对于像 Kafka 这样的无限源,"总和"到底有什么作用?

DataStream<Tuple2<String, Long>> counts = input
......
.returns(Types.TUPLE(Types.STRING, Types.LONG))
.keyBy(0)
.sum(1);

当有时间窗口时,我有点理解它,它对我来说就像一个"批处理",因为它有开始和结束时间,但是当根本没有时间窗口时,

  1. 开始时间和结束时间是什么?
  2. 当 Flink 第 3 次收到单词 'foo' 时,"sum"会遍历所有旧的 'foo',做 1+1+1,并给出结果 '3'。或者,Flink 在上一步以某种方式保存了一个中间结果"2",所以"总和"只做 2+1?
  3. 有没有另一种方法来做求和,我的意思是,使用 keyBy(0).process(...) 或其他东西?

指定的程序将转换为带有SumAggregatorStreamGroupedReduceStreamGroupedReduce要做的是不断减少传入的数据流,并在每条传入记录后输出新的减少值。

在内部,StreamGroupedReduce使用保持电流降低值的ValueState。每当有新记录到达时,通过调用ReduceFunction将当前归约值与传入记录合并(在您的情况下为SumAggregator)。然后,此操作的结果存储在操作员的ValueState中,并输出给下游消费者。

例如:输入流1, 2, 3, 4, 5在求和时将生成以下输出:1, 3, 5, 9, 14

如果需要,则可以使用keyBy(0).process(...)实现相同的行为。

相关内容

  • 没有找到相关文章

最新更新