Flink流式传输,“ sum”到底是做什么的?

时间:2019-03-06 08:00:47

标签: java apache-flink flink-streaming

我在理解流式传输时遇到了麻烦,以工作量为例,对于像卡夫卡这样的无限来源,“和”到底是做什么的?

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

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

  1. 开始时间和结束时间是多少?
  2. 当第三次Flink收到单词“ foo”时,“ sum”是否经过所有旧的“ foo”,进行1 + 1 + 1,并给出结果“ 3”。还是Flink以某种方式在上一步中保存了中间结果'2',所以'sum'只做2 + 1?
  3. 有没有其他方法可以求和,我是说要使用keyBy(0).process(...)还是什么?

1 个答案:

答案 0 :(得分:2)

指定的程序将转换为带有StreamGroupedReduce的{​​{1}}。 SumAggregator要做的是连续减少输入数据流,并在每条输入记录之后输出新的减小的值。

在内部,StreamGroupedReduce使用StreamGroupedReduce保留当前的缩减值。每当有新记录到达时,就通过调用ValueState(在您的情况下为ReduceFunction中)将当前的减少值与传入的记录合并。然后,此操作的结果存储在操作员的SumAggregator中,并输出到下游使用者。

例如:输入流ValueState求和时将产生以下输出:1, 2, 3, 4, 5

如果需要,可以使用1, 3, 5, 9, 14实现相同的行为。