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