溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

flink的trigger知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2021-12-31 13:39:36 來源:億速云 閱讀:157 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“flink的trigger知識(shí)點(diǎn)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“flink的trigger知識(shí)點(diǎn)有哪些”吧!

flink的窗口計(jì)算的一個(gè)小功能-trigger。

窗口這個(gè)概念還是比較好理解的,就是在某一個(gè)緯度(時(shí)間,條數(shù)等)上選取一段范圍,這個(gè)范圍就是窗口,然后我們后面的計(jì)算針對(duì)這個(gè)窗口進(jìn)行。今天的例子主要是針對(duì)時(shí)間窗口進(jìn)行講解。

不得不說flink支持的窗口操作還是比較豐富的:

會(huì)話窗口、滾動(dòng)窗口、滑動(dòng)窗口等。

就拿滑動(dòng)窗口舉例子,滑動(dòng)窗口故名思意就是除了在時(shí)間維度上開窗之外,我們還要指定一下這個(gè)窗口以什么樣的步子在時(shí)間尺度上移動(dòng),這個(gè)就叫滑動(dòng)間隔,如下圖:

flink的trigger知識(shí)點(diǎn)有哪些

從而可以得到滑動(dòng)窗口兩個(gè)重要的參數(shù)就是窗口大小滑動(dòng)間隔

對(duì)于flink的窗口操作,尤其是基于事件時(shí)間的窗口操作,大家還要掌三個(gè)個(gè)重要的知識(shí)點(diǎn):

  1. 窗口分配器:就是決定著流入flink的數(shù)據(jù),該屬于哪個(gè)窗口。

  2. 時(shí)間戳抽取器/watermark生成器:抽取時(shí)間戳并驅(qū)動(dòng)著程序正常執(zhí)行。

  3. trigger:決定著數(shù)據(jù)啥時(shí)候落地。

這些我們后面會(huì)在星球里一一講解,本文主要是講一下trigger。

回想一下spark streaming的窗口操作,其實(shí)就是一個(gè)更大的批處理,窗口按照指定的滑動(dòng)間隔去滑動(dòng),然后窗口和滑動(dòng)間隔的大小是批處理的整數(shù)倍。

數(shù)據(jù)啥時(shí)候處理結(jié)束并落地呢?

滑動(dòng)間隔就是計(jì)算的周期。那么處理時(shí)間就是從窗口開始到數(shù)據(jù)落地所需要的時(shí)間,該時(shí)間正常情況下要小于等于滑動(dòng)間隔的,否則就會(huì)產(chǎn)生隊(duì)列擠壓。

其實(shí),這個(gè)思想也是spark streaming 的微批處理的思想,也是基于處理時(shí)間的思想。

而flink不是,flink是真正的實(shí)時(shí)處理,數(shù)據(jù)流入flink的source之后,假如需要窗口函數(shù),我們就要使用一定的規(guī)則來判斷或者叫決定該數(shù)據(jù)應(yīng)該屬于哪個(gè)窗口,然后是窗口要是基于事件時(shí)間的話我們還要提供時(shí)間戳抽取器和watermark分配器,最后還要指定滿足何種條件觸發(fā)窗口計(jì)算并輸出結(jié)果。

那可能會(huì)說了觸發(fā)窗口計(jì)算,不就是時(shí)間到窗口結(jié)束時(shí)間了直接輸出不就行了嗎?這樣輸出的頻率可以直接由滑動(dòng)間隔來控制了。

實(shí)際上,不行的,基于事件時(shí)間處理機(jī)制,數(shù)據(jù)會(huì)在有些意想不到的情況下滯后,比如forward故障等,這種情況,對(duì)于flink來說我們可以設(shè)置一些參數(shù)來允許處理滯后的元素,比如允許其滯后一小時(shí),那么這個(gè)時(shí)候?qū)嶋H上窗口輸出間隔就是要加上這個(gè)滯后時(shí)間了,這時(shí)候假如我們想要盡可能的實(shí)時(shí)輸出的話,就要用到flink的trigger機(jī)制。

Trigger定義了何時(shí)開始使用窗口計(jì)算函數(shù)計(jì)算窗口。每個(gè)窗口分配器都會(huì)有一個(gè)默認(rèn)的Trigger。如果,默認(rèn)的Trigger不能滿足你的需求,你可以指定一個(gè)自定義的trigger().

trigger接口有五個(gè)方法允許trigger對(duì)不同的事件做出反應(yīng):

onElement():進(jìn)入窗口的每個(gè)元素都會(huì)調(diào)用該方法。

onEventTime():事件時(shí)間timer觸發(fā)的時(shí)候被調(diào)用。

onProcessingTime():處理時(shí)間timer觸發(fā)的時(shí)候會(huì)被調(diào)用。

onMerge():有狀態(tài)的觸發(fā)器相關(guān),并在它們相應(yīng)的窗口合并時(shí)合并兩個(gè)觸發(fā)器的狀態(tài),例如使用會(huì)話窗口。

clear():該方法主要是執(zhí)行窗口的刪除操作。

關(guān)于上述方法需要注意兩點(diǎn):

1).前三方法決定著如何通過返回一個(gè)TriggerResult來操作輸入事件。

  • CONTINUE:什么都不做。

  • FIRE:觸發(fā)計(jì)算。

  • PURE:清除窗口的元素。

  • FIRE_AND_PURE:觸發(fā)計(jì)算和清除窗口元素。

2).這些方法中的任何一個(gè)都可用于為將來的操作注冊(cè)處理或事件時(shí)間計(jì)時(shí)器

內(nèi)置和自定義觸發(fā)器 

Flink內(nèi)部有一些內(nèi)置的觸發(fā)器:

  • EventTimeTrigger:基于事件時(shí)間和watermark機(jī)制來對(duì)窗口進(jìn)行觸發(fā)計(jì)算。

  • ProcessingTimeTrigger:基于處理時(shí)間觸發(fā)。

  • CountTrigger:窗口元素?cái)?shù)超過預(yù)先給定的限制值的話會(huì)觸發(fā)計(jì)算。

  • PurgingTrigger作為其它trigger的參數(shù),將其轉(zhuǎn)化為一個(gè)purging觸發(fā)器。

WindowAssigner的默認(rèn)觸發(fā)器適用于很多案例。比如,所有基于事件時(shí)間的窗口分配器都用EventTimeTrigger作為默認(rèn)觸發(fā)器。該觸發(fā)器會(huì)在watermark達(dá)到窗口的截止時(shí)間時(shí)直接觸發(fā)計(jì)算輸出。

到此,相信大家對(duì)“flink的trigger知識(shí)點(diǎn)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI