在本文中,我将分享编码示例,这些示例是 Flink 中 TumblingWindow 的一些关键方面。不熟悉 Flink 流的人员可以在此处获得介绍

在进入TumblingWindow之前,让我们在流处理或流计算方面对”窗口”有一个基本的了解。 在数据流中,您有一个源持续生成数据,这使得计算最终值变得不可行。  

在大多数用例中,要获得有意义的信息,最好使用两种方法

  • 随时间的有限集计算(例如,每分钟 HTTP 401 错误)
  • 计算以滚动更新完成(例如,记分板、趋势主题)

“Window”定义一组有限的元素,用于未绑定的流,我们可以应用计算。此集可以基于时间、元素计数、计数和时间的组合,或者一些自定义逻辑来将元素分配给窗口。

  • 每分钟收到的订单数(固定时间)
  • 完成最后 100 个订单的平均时间(固定元素)

流式处理框架供应商实现如何定义”窗口”的多个变体。Flink 有三种类型(a) 翻滚 (b) 滑动和 (c) 会话窗口,我将集中讨论本文的第一个窗口。

您还可以享受:带Apache Flink 的流式 ETL

翻滚窗口

这个窗口简单易懂,易于入门。它是一个固定大小的窗口,其中”大小”是时间(30 秒,5 分钟)或只是计数(100 个元素)。

Fig-1 : An example of Window

5 分钟的时间窗口将收集到达窗口中的所有元素,并在 5 分钟后对其进行评估计数窗口100 将在窗口中收集 100 个元素,并在添加第 100 个元素后计算该窗口。

最重要的是,不会重叠窗口,也不会有重复的元素。每个元素仅分配给一个窗口。如果已指定密钥,则 Flink 将在逻辑上对流进行分区,并为每个键控元素运行并行窗口操作。

让我们举一个例子来更好地理解它们。一个简单的 IntegerGenerator “”类充当源,每秒生成一个整数(从 1 开始)。以下行初始化本地 Flink 环境并创建 DataStream 对象。

Java

X
1
流执行环境env=流执行环境获取执行环境();
2
数据流<整数>intStream=env

时间窗口ALL(时间.秒( 5 )
.进程(新进程AllWindow函数_lt;整数,整数,时间窗口>()
{
@Override
公共 void 进程(上下文 arg0、可迭代<整数>输入、收集器_lt;整数>输出)引发异常
{
logger.info(”计算对 _}的计算总和”,输入 );
int 总和 = 0;
for (int i : 输入) |
总和 = i;
}
输出.收集(总和 );
}
})
.print();

env.execute();

xxxxxxxxx
1
18
1
intStream
2
.时间窗口所有时间5
3

信息(”计算总和”,输入);

9
    int总和=0;
10
    (inti输入) |
11
      总和=i;
12
    }
13
    输出收集总和;
14
  }
15
})
16
.印刷();
17
        
18
Env

在这里,我只是计算在给定窗口期间收集的所有整数的总和。

注意ProcessAllWindowFunction 将允许 Flink 缓冲内存中窗口的所有元素,然后传递整个元素进行计算。因此,将 Iterable<> 对象作为 输入参数。 process()

第 13 行 – 将此窗口的结果返回 Flink,以便执行下一步,即在控制台上打印。

以下显示示例运行的输出

Fig-2: Output of TumblingTimeWindow example

让我们在这里剖析输出。

  • 行#1 – #3 = 在当前窗口关闭之前生成了两个整数。请注意,即使我们说五秒钟,第一个窗口没有运行五秒钟。原因是,默认情况下 Flink 会舍入到最近的时钟边界,在我们的案例中,该边界发生在”13:33:55″。这触发了 Flink 触发器窗口以关闭当前窗口并将其传递到下一步(Flink 的运算符)。
  • 行#4 = 使用 process() 所有元素调用方法 [1, 2],总和 “3”打印到控制台
  • 行#5 – #10 = 新窗口开始,并收集下一组整数。在”13:34:00″5秒后,窗口关闭。所收集的所有数据都发送到处理,其中打印它收到的整数,并计算此窗口中的数字总和 = “18”。
  • 行#11 = 当前窗口总和打印到控制台。
  • 类似的逻辑从线#12进一步应用。

备注 –此新窗口中不存在上一个窗口中的整数。下一个窗口在当前窗口关闭后启动(没有重叠和重复)。

翻滚计数窗口

Java