Flink 為什么需要窗口(Window)?
Flink 認(rèn)為?Batch 是 Streaming 的一個特例,所以 Flink 底層引擎是一個流式引擎,在上面實現(xiàn)了流處理和批處理。而窗口(window)就是從 Streaming 到 Batch 的一個橋梁。Flink 提供了非常完善的窗口機(jī)制。
1 為什么需要Window
在流處理應(yīng)用中,數(shù)據(jù)是連續(xù)不斷的,有時我們需要做一些聚合類的處理,例如:在過去的1分鐘內(nèi)有多少用戶點擊了我們的網(wǎng)頁。
在這種情況下,我們必須定義一個窗口(window),用來收集最近1分鐘內(nèi)的數(shù)據(jù),并對這個窗口內(nèi)的數(shù)據(jù)進(jìn)行計算。
Windows 是處理無限流的核心。Windows 將流拆分為有限大小的“桶”,我們可以對其進(jìn)行計算。
2 Flink窗口應(yīng)用代碼結(jié)構(gòu)
Flink的窗口算子為我們提供了方便易用的API,我們可以將數(shù)據(jù)流切分成一個個窗口,對窗口內(nèi)的數(shù)據(jù)進(jìn)行處理。本文將介紹如何在Flink上進(jìn)行窗口的計算。
一個Flink窗口應(yīng)用的大致骨架結(jié)構(gòu)如下所示:
Keyed Window
Non-Keyed Window
在上面,方括號 ([…]) 中的命令是可選的。這表明 Flink 允許您以多種不同的方式自定義窗口邏輯,使其最適合您的需求。
首先:我們要決定是否對一個DataStream按照Key進(jìn)行分組,這一步必須在窗口計算之前進(jìn)行。經(jīng)過keyBy的數(shù)據(jù)流將形成多組數(shù)據(jù),下游算子的多個實例可以并行計算。windowAll不對數(shù)據(jù)流進(jìn)行分組,所有數(shù)據(jù)將發(fā)送到下游算子單個實例上。決定是否分組之后,窗口的后續(xù)操作基本相同,經(jīng)過windowAll的算子是不分組的窗口(Non-Keyed Window),它們的原理和操作與Keyed Window類似,唯一的區(qū)別在于所有數(shù)據(jù)將發(fā)送給下游的單個實例,或者說下游算子的并行度為1。
