【发布时间】:2021-12-16 14:43:24
【问题描述】:
我是 apache flink 的新手,正在尝试了解 flink 如何处理 EventTime 和 Windowing 的概念。
所以这是我的场景:
-
我有一个程序作为线程运行并创建一个包含 3 个文件的文件 每秒字段,其中第三个字段是时间戳。
-
虽然每 5 秒我会在新创建的文件中输入一个较旧的时间戳(你可以说是 t-5),但会有一些调整。
-
现在我运行读取上述 3 个字段的流处理作业 成一个元组。
-
现在我已经为水印和时间戳生成定义了以下代码:
WatermarkStrategy .<Tuple3<String, Integer, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(4)) .withTimestampAssigner((event, timestamp) -> event.f2); -
然后我使用以下代码对上述内容进行窗口化并尝试获取聚合:
withTimestampsAndWatermarks .keyBy(0) .window(TumblingEventTimeWindows.of(Time.milliseconds(4000))) .reduce((x,y) -> new Tuple3<String, Integer, Long>(x.f0, x.f1 + y.f1,y.f2)) -
很明显,我正在尝试聚合每个字段中的数字。(更多上下文,我要聚合的字段(f2)都是 1)
因此我有以下问题:
- 即窗口只有 4 秒宽,每五个条目 一个较旧的时间戳,所以我期待下一个窗口有 较少的计数。我的理解有错吗?
- 如果我的理解是正确的 - 我在并行运行两个程序时看不到任何聚合,我的代码有问题吗?
- 另一个困扰我的问题是窗口开始时间和结束时间真正依赖于哪些字段或哪些参数?是从事件中提取的时间戳还是从处理时间中提取的时间戳
【问题讨论】:
标签: apache-flink