實(shí)時(shí)數(shù)倉(cāng)-Flink窗口的實(shí)現(xiàn)與應(yīng)用

本文檔整理于Flink社區(qū)直播課
Flink窗口是實(shí)時(shí)處理非常重要的技術(shù)僻族,廣泛用于實(shí)時(shí)ETL紧阔、實(shí)時(shí)報(bào)表以及一些實(shí)時(shí)的監(jiān)控蛾找。

學(xué)習(xí)路線

image.png

為什么要關(guān)心實(shí)現(xiàn)

  • ReduceFunction為什么不用計(jì)算每個(gè)key的聚合值漠吻?
  • 當(dāng)key基數(shù)很大時(shí)途乃,如何有效計(jì)算每個(gè)key窗口計(jì)算?
  • 窗口計(jì)算的中間結(jié)果如何存儲(chǔ)烫饼,何時(shí)被清理枫弟?
  • 窗口計(jì)算如何容忍late data?
val input: DataStream[(String, Long)] = ...

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .reduce { (v1, v2) => (v1._1, v1._2 + v2._2) }

實(shí)時(shí)數(shù)倉(cāng)典型架構(gòu)

image.png

Window應(yīng)用場(chǎng)景

image.png

Window抽象概念

image.png
  • TimeStampAssigner: 當(dāng)基于Event Time時(shí)間語(yǔ)義時(shí)骇塘,定義數(shù)據(jù)流的event time并定義Watermark的生成算法款违。
  • KeySelector:keyBy(col...)插爹,以什么字段分組,選擇根據(jù)什么維度來(lái)做窗口聚合力穗。
  • WindowAssigner: 窗口分配器当窗,定義即將到來(lái)的元素應(yīng)該分配給哪一個(gè)窗口
  • state:窗口狀態(tài)崖面,增量聚合函數(shù)時(shí)狀態(tài)為ValueState梯影,全量聚合函數(shù)時(shí)狀態(tài)為一個(gè)ListState
  • Trigger 觸發(fā)器甲棍,定義窗口何時(shí)出發(fā)計(jì)算,發(fā)出計(jì)算結(jié)果
  • Evictor 移除器倘零,在ProcessWindowFunction調(diào)用之后或之前引用戳寸∫呷担可以從窗口中刪除已經(jīng)收集的元素拆吆。由于需要遍歷所有元素,只能在沒(méi)有定義增量聚合函數(shù)時(shí)使用霉晕。
  • ProcessWindowFunction 全量窗口函數(shù)牺堰,可以訪問(wèn)窗口的元數(shù)據(jù)如窗口的開(kāi)始時(shí)間以及結(jié)束時(shí)間伟葫,訪問(wèn)當(dāng)前處理時(shí)間和Watermark筏养,表達(dá)能力比增量集合函數(shù)強(qiáng)渐溶,代價(jià)是大狀態(tài)掌猛,可以結(jié)合增量聚合函數(shù)使用眉睹。

Window編程接口

image.png

Window Assigner

image.png

Window Trigger

什么是Trigger

Flink中Trigger用于定義何時(shí)對(duì)窗口進(jìn)行計(jì)算并發(fā)出結(jié)果慕蔚,它的觸發(fā)條件可以是時(shí)間也可以是某些特定條件斋配。對(duì)于時(shí)間窗口而言,默認(rèn)Trigger是Watermark大于窗口結(jié)束時(shí)間時(shí)觸發(fā)桂对。

在Flink窗口機(jī)制中鸠匀,還有一個(gè)窗格的概念宅此,它將窗口劃分成多個(gè)規(guī)則的部分爬范,這些部分可看作子窗口青瀑,可簡(jiǎn)單理解為對(duì)窗口再次分片狱窘。窗口則定義為一組key相同(分區(qū)操作),并且位于同一個(gè)窗口中的元素。每個(gè)窗格都有一個(gè)Trigger對(duì)象搭儒。

先看看Trigger類中的幾個(gè)重要函數(shù):

    //  每當(dāng)有元素添加到窗口都會(huì)調(diào)用
    public abstract TriggerResult onElement(T element, long timestamp, W window, TriggerContext ctx) throws Exception;
    //  在處理時(shí)間計(jì)時(shí)器觸發(fā)時(shí)調(diào)用
    public abstract TriggerResult onProcessingTime(long time, W window, TriggerContext ctx) throws Exception;
    //  在事件時(shí)間計(jì)時(shí)器觸發(fā)時(shí)調(diào)用
    public abstract TriggerResult onEventTime(long time, W window, TriggerContext ctx) throws Exception;
    //  該函數(shù)會(huì)在清除窗口是調(diào)用
    public abstract void clear(W window, TriggerContext ctx) throws Exception;
TriggerResult

每次調(diào)用觸發(fā)器都會(huì)生成一個(gè)TriggerResult,它用于決定窗口接下來(lái)的行為茴扁。

  • CONTINUE: 不做任何處理
  • FIRE:觸發(fā)計(jì)算
  • PURGE:完全清除窗口內(nèi)容峭火,并刪除窗口自身及元數(shù)據(jù)纺且。
  • FIRE_AND_PURGE:先進(jìn)行窗口計(jì)算(FIRE)载碌,隨后刪除所有狀態(tài)及元數(shù)據(jù)(PURGE)
Flink中Trigger的幾個(gè)實(shí)現(xiàn)類:
內(nèi)置Trigger 說(shuō)明
ProcessingTimeTrigger 一次觸發(fā),machine time大于窗口結(jié)束時(shí)間時(shí)觸發(fā)
EventTimeTrigger 一次觸發(fā),watermark大于窗口結(jié)束時(shí)間時(shí)觸發(fā)
ContinuousProcessingTimeTrigger 多次觸發(fā),基于processing time的固定時(shí)間間隔
ContinuousEventTimeTrigger 多次觸發(fā) ,基于event time的固定時(shí)間間隔
CountTrigger 多次觸發(fā),基于element的固定條數(shù)
DeltaTrigger 多次觸發(fā),當(dāng)前element與上次觸發(fā)trigger的element做delta計(jì)算,超過(guò)threshold(閾值)時(shí)觸發(fā)
PurgingTrigger trigger wrapper,當(dāng)nested trigger時(shí)觸發(fā),額外會(huì)清理窗口當(dāng)前的中間狀態(tài)
  • DeltaTrigger :會(huì)計(jì)算一個(gè)Delta值,那么到底是誰(shuí)跟誰(shuí)計(jì)算一個(gè)Delta呢?當(dāng)前的element與上次觸發(fā)Trigger的element做一個(gè)Delta計(jì)算.如果超過(guò)了指定的閾值,那么就觸發(fā)計(jì)算.

  • PurgingTrigger:實(shí)際上是一個(gè)wrapper,是對(duì)上一個(gè)Trigger的包裝,它可以對(duì)嵌套的Trigger做什么事情呢?讓嵌套的Trigger自己去觸發(fā),一旦它觸發(fā)的時(shí)候,可以給一個(gè)額外的功能,額外會(huì)清除窗口當(dāng)前的中間狀態(tài).

Trigger實(shí)例

  • 圖trigger-1表示event time的數(shù)據(jù)流朗伶,定義5分鐘的滾動(dòng)窗口步咪,窗口函數(shù)會(huì)計(jì)算事件的累計(jì)次數(shù)纯丸,同時(shí)使用基于event time的固定事件間隔的觸發(fā)器將結(jié)構(gòu)(窗口狀態(tài))sink到外部系統(tǒng)。


    trigger-1
  • 前面2min的數(shù)據(jù)進(jìn)入窗口后,積累次數(shù)(作為窗口狀態(tài))坠陈,由于定義了間隔2min的窗口觸發(fā)器捐康,此時(shí)結(jié)果將sink到外部系統(tǒng)解总。


    trigger-2
  • 第三分鐘數(shù)據(jù)到達(dá)時(shí)刻盐,窗口狀態(tài)更新敦锌,但還沒(méi)有達(dá)到下次窗口出發(fā)的時(shí)間乙墙。


    trigger-3
  • 第4分鐘數(shù)據(jù)進(jìn)入窗口听想,更新窗口狀態(tài)哗魂,達(dá)到窗口觸發(fā)條件(間隔2min)录别,發(fā)出結(jié)果组题,并對(duì)外部系統(tǒng)中已經(jīng)存在的結(jié)果值發(fā)出更新梢褐。


    trigger-4
Question:如果Result只能Append赵讯,不支持Update(如Druid)盈咳,該如何解決呢?

PurgingTrigger:對(duì)于嵌套在內(nèi)的觸發(fā)器觸發(fā)計(jì)算時(shí)边翼,同時(shí)清除窗口中的狀態(tài)鱼响。

image.png

Window Evictor

image.png

注:關(guān)于Window Trigger與Evictor的具體實(shí)現(xiàn)與案例,總結(jié)起來(lái)比較多组底,我會(huì)放在Trigger丈积、Evictor源碼篇里面去講解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末债鸡,一起剝皮案震驚了整個(gè)濱河市江滨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唬滑,老刑警劉巖镊屎,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件用狱,死亡現(xiàn)場(chǎng)離奇詭異溺忧,居然都是意外死亡祟滴,警方通過(guò)查閱死者的電腦和手機(jī)草慧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門抖剿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缩宜,“玉大人宋梧,你說(shuō)我怎么就攤上這事加叁。” “怎么了告希?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵仙逻,是天一觀的道長(zhǎng)缺亮。 經(jīng)常有香客問(wèn)我号阿,道長(zhǎng)枯夜,這世上最難降的妖魔是什么摔吏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般驰后。 火紅的嫁衣襯著肌膚如雪灶芝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驹愚,可吹牛的內(nèi)容都是我干的倘潜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惩妇!你這毒婦竟也來(lái)了株汉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歌殃,失蹤者是張志新(化名)和其女友劉穎乔妈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氓皱,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褒翰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年贮懈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片优训。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖各聘,靈堂內(nèi)的尸體忽然破棺而出揣非,到底是詐尸還是另有隱情,我是刑警寧澤躲因,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布早敬,位于F島的核電站,受9級(jí)特大地震影響大脉,放射性物質(zhì)發(fā)生泄漏搞监。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一镰矿、第九天 我趴在偏房一處隱蔽的房頂上張望琐驴。 院中可真熱鬧,春花似錦秤标、人聲如沸绝淡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牢酵。三九已至,卻和暖如春衙猪,著一層夾襖步出監(jiān)牢的瞬間馍乙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工垫释, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丝格,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓饶号,卻偏偏與公主長(zhǎng)得像铁追,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茫船,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容