每隔 5 秒,计算最近 10 秒单词出现的次数 —— 滑动窗口
每隔 5 秒,计算最近 5 秒单词出现的次数 —— 滚动窗口
示意图:
Flink Window 触发的条件:
企业生产中一般不用。
治标不治本,企业生产中一般不用。
企业生产中应用较为广泛。
一个 window 可能会接受到多个 waterMark,我们以最小的为准。
https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/dev/datastream/operators/windows/
Flink 的 window 分为两种类型的 Window,分别是:Keyed Windows 和 Non-Keyed Windows,他们的使用方式不同:
// Keyed Windows stream .keyBy(...) <- keyed versus non-keyed windows .window(...) <- required: "assigner" [.trigger(...)] <- optional: "trigger" (else default trigger) [.evictor(...)] <- optional: "evictor" (else no evictor) [.allowedLateness(...)] <- optional: "lateness" (else zero) [.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data) .reduce/aggregate/apply() <- required: "function" [.getSideOutput(...)] <- optional: "output tag"
// Non-Keyed Windows stream .windowAll(...) <- required: "assigner" [.trigger(...)] <- optional: "trigger" (else default trigger) [.evictor(...)] <- optional: "evictor" (else no evictor) [.allowedLateness(...)] <- optional: "lateness" (else zero) [.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data) .reduce/aggregate/apply() <- required: "function" [.getSideOutput(...)] <- optional: "output tag"
Flink 流批同一前后的 Window 分类:
高级玩法:自定义 Trigger、自定义 Evictor,读者可自行搜索相关文章与代码。
// 在 Flink 中对两个 DataStream 做 Join // 1、指定两张表 // 2、指定这两张表的链接字段 stream.join(otherStream) // 两个流进行关联 .where() // 选择第一个流的key作为关联字段 .equalTo( ) // 选择第二个流的key作为关联字段 .window( ) // 设置窗口的类型 .apply( ) // 对结果做操作 process apply = foreach
核心代码示例:
DataStreamorangeStream = ...; DataStream greenStream = ...; orangeStream .keyBy( ) .intervalJoin(greenStream.keyBy( )) .between(Time.milliseconds(-2), Time.milliseconds(1)) .process (new ProcessJoinFunction out) { out.collect(first + "," + second); } });