java - Flink 流媒体,“sum”到底是做什么的?
问题描述
我无法理解流式传输,以工作计数为例,对于像 Kafka 这样的无限源,“sum”到底是做什么的?
DataStream<Tuple2<String, Long>> counts = input
......
.returns(Types.TUPLE(Types.STRING, Types.LONG))
.keyBy(0)
.sum(1);
当有时间窗口时我有点理解,对我来说就像一个“批次”,因为它有开始和结束时间,但是当根本没有时间窗口时,
- 开始时间和结束时间是什么时候?
- 当 Flink 第三次接收到单词 'foo' 时,'sum' 是否会遍历所有旧的 'foo',做 1+1+1,并给出结果 '3'。或者,Flink 以某种方式在上一步中保存了一个中间结果 '2',所以 'sum' 只做 2+1?
- 有没有另一种方法来求和,我的意思是,使用 keyBy(0).process(...) 什么的?
解决方案
指定的程序将转换为StreamGroupedReduce
带有SumAggregator
. 它将做的StreamGroupedReduce
是不断减少传入的数据流并在每个传入记录之后输出新的减少值。
在内部,StreamGroupedReduce
使用 aValueState
来保持当前的减少值。每当有新记录到达时,当前的 reduce 值都会通过调用ReduceFunction
(在您的情况下SumAggregator
)与传入记录相结合。然后,此操作的结果存储在操作员中ValueState
并输出到下游消费者。
例如:输入流1, 2, 3, 4, 5
在求和时会产生如下输出:1, 3, 5, 9, 14
.
如果需要,您可以使用keyBy(0).process(...)
.
推荐阅读
- java - Java同步:多个CountDownLatch
- sms - 有谁知道 Spectrum Mobile 的 SMS 网关,我可以使用 SMTP 吗?
- database - 如何使用未准备好的数据库启动 Spring-Boot webapp + Spring-Batch?
- visual-studio-code - 用于保存和重用我自己的自定义代码片段/样板的 Visual Studio Code 扩展?
- git - 使用一个命令将多个分支重新设置为 master
- javascript - 从主文件调用另一个文件中的异步函数
- java - application.properties 中的当前项目位置引用变量
- php - 函数 App\Http\Controllers\Auth\AdaugaJobController::create() 的参数太少,通过了 0,预期正好 1
- python - 使用 Visual Studio Code 编写 Python 代码时,为什么会收到 2 条错误消息?
- c - 表达式必须具有指向带有结构的对象类型的指针