日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Flink中window 窗口和時(shí)間以及watermark水印

作者:Leo Han 更新時(shí)間: 2022-01-21 編程語言

我們都知道,F(xiàn)link的核心是流式處理,但同時(shí)也支持批處理,F(xiàn)link底層是一個(gè)流式引擎,在這個(gè)上面實(shí)現(xiàn)了流處理和批處理,而窗口則是批處理的實(shí)現(xiàn)。

在Flink中window從大的分類上主要有三種:Time Window(根據(jù)時(shí)間)、Count Window(根據(jù)數(shù)據(jù)量)、Session Window(會(huì)話窗口)

窗口類型有如下兩種:

  • Tumbling Window 滾動(dòng)窗口,窗口之間的數(shù)據(jù)沒有重疊
  • Sliding Window 滑動(dòng)窗口,窗口之間的數(shù)據(jù)有可能重疊
    在這里插入圖片描述

Count Window

Count Window主要有兩類:

  • Tumble Count Window:累積固定個(gè)數(shù)的數(shù)據(jù)就作為一個(gè)窗口,按照數(shù)據(jù)量來統(tǒng)計(jì),不是按照時(shí)間,比如countWindow(100) 表示當(dāng)窗口中的數(shù)據(jù)有100個(gè)的時(shí)候開始計(jì)算
  • Sliding Count Window: 累積固定個(gè)數(shù)的數(shù)據(jù)就作為一個(gè)窗口,超過指定數(shù)量個(gè)數(shù)數(shù)據(jù)開啟新一個(gè)窗口計(jì)算,比如 coutnWindow(100,10)窗口大小是100,滑動(dòng)間隔是10,每增加10個(gè)元素就會(huì)對(duì)前面的100個(gè)元素計(jì)算一次

Time Window

Time Window是根據(jù)時(shí)間對(duì)數(shù)據(jù)進(jìn)行分組的,

  • Tumble Time Window: 在時(shí)間上按照給定的窗口大小切分窗口,窗口之間不會(huì)重疊
  • Sliding Time Window: 在時(shí)間上按照給定的窗口大小、滑動(dòng)步長切分窗口,窗口之間可能會(huì)存在數(shù)據(jù)重疊

Session Window

session window意為會(huì)話窗口,與HTTP請(qǐng)求的session概念類似,當(dāng)超過一段時(shí)間,窗口沒有收到數(shù)據(jù)時(shí),認(rèn)為窗口結(jié)束,計(jì)算窗口內(nèi)的數(shù)據(jù),窗口之間數(shù)據(jù)不會(huì)重疊

對(duì)于TimeWindow,在Flink中有幾個(gè)時(shí)間語義:
Flink中主要有如下三種時(shí)間語義:

  • Event Time ,數(shù)據(jù)自帶的時(shí)間屬性,使用這個(gè)語義時(shí)需要指定數(shù)據(jù)中哪個(gè)字段表示該時(shí)間同事必須設(shè)置WaterMark。使用Event Time時(shí),數(shù)據(jù)可能是亂序的。在計(jì)算時(shí),F(xiàn)link會(huì)緩存窗口內(nèi)的數(shù)據(jù)直到接收到WaterMark,WaterMark假設(shè)不會(huì)有更晚的數(shù)據(jù)到達(dá),意味著在同一個(gè)時(shí)間窗口下,F(xiàn)link會(huì)等待一個(gè)有限的時(shí)間,在一定程度上降低了計(jì)算結(jié)果的絕對(duì)準(zhǔn)確性,并且增加了系統(tǒng)的延遲
  • Processing Time: 數(shù)據(jù)進(jìn)入某個(gè)算子,算子開始執(zhí)行時(shí)的系統(tǒng)時(shí)間,不需要WaterMark機(jī)制,只依賴當(dāng)前節(jié)點(diǎn)的操作系統(tǒng)時(shí)間
  • Ingestion Time: 數(shù)據(jù)到達(dá)Flink Source的時(shí)間,從Source到下游的各個(gè)算子中可能有多個(gè)計(jì)算環(huán)節(jié),任何一個(gè)算子處理速度的快慢可能影響下游算子的Processing Time,而 Ingestion Time定義的是數(shù)據(jù)流入Flink的時(shí)間,不會(huì)被下游算子處理速度影響,因此Ingestion Time通常是Event Time和Processing Time的一個(gè)折中方案,Ingestion Time不需要設(shè)置復(fù)Water Mark,也不需要太多緩存,延遲較低。

在這里插入圖片描述

watermark水印

watermark一般是在Event Time語義下使用,我們知道,Event Time 是事件發(fā)生的時(shí)間,但是進(jìn)入到Flink中并不一定按照EventTime順序進(jìn)入,導(dǎo)致窗口收到的時(shí)間會(huì)存在亂序問題,這種情況下,數(shù)據(jù)可能出現(xiàn)亂序和延遲情況,而WaterMark就是為了解決這個(gè)問題。
我們假設(shè)窗口為滾動(dòng)窗口,窗口大小為1分鐘,正常情況下,窗口如下:
窗口1 : [20212-08 08:00:00 , 20212-08 08:01:00)
窗口2: [20212-08 08:01:00 , 20212-08 08:02:00)
窗口3: [20212-08 08:02:00 , 20212-08 08:03:00)

如果有一條數(shù)據(jù)的時(shí)間時(shí)間為 20212-08 08:00:30 在 20212-08 08:01:15到達(dá),這個(gè)時(shí)候窗口1在20212-08 08:01:00已經(jīng)處理完了,按照正常情況下,這條數(shù)據(jù)會(huì)被丟棄。
采用WaterMark機(jī)制之后,比如設(shè)置MaterMark為延遲20秒,那么這時(shí)候窗口1要在 20212-08 08:01:20的是才會(huì)觸發(fā)計(jì)算,相當(dāng)于這個(gè)窗口等了20秒之后才觸發(fā)計(jì)算,而在等待20s的時(shí)間內(nèi),如果在[20212-08 08:00 , 20212-08 08:01:00)在這延遲的20s能夠到達(dá),那么也會(huì)納入窗口1的計(jì)算中。

在Flink中如果時(shí)間語義設(shè)置為Event Time:env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);的話必須設(shè)置WaterMark。

Flink中WaterMark生成方式有兩種:

  • 周期性生成,一般每隔200ms生成一個(gè)WaterMark
  • 數(shù)據(jù)流中每個(gè)數(shù)據(jù)eventTime都產(chǎn)生一個(gè)watermark

原文鏈接:https://blog.csdn.net/LeoHan163/article/details/122293795

欄目分類
最近更新