1.時(shí)間語義
1.時(shí)間語義

image.png
- Event Time:
- 是事件發(fā)生的時(shí)間。
- 事件時(shí)間
- 它通常由事件中的時(shí)間戳描述,例如采集的日志數(shù)據(jù)中,每一條日志都會(huì)記錄自己的生成時(shí)間,F(xiàn)link 通過時(shí)間戳分配器訪問事件時(shí)間戳。
- 是事件發(fā)生的時(shí)間。
- Ingestion Time:
- 是數(shù)據(jù)進(jìn)入 Flink 的時(shí)間。
- 涉入時(shí)間
- Processing Time:
- 是每一個(gè)執(zhí)行基于時(shí)間操作的算子的本地系統(tǒng)時(shí)間,與機(jī)器相關(guān),默認(rèn)的時(shí)間屬性就是 Processing Time。
- 處理時(shí)間
1.1 例子

image.png
- 電影發(fā)行時(shí)間就是 事件時(shí)間
- 我們發(fā)現(xiàn)這個(gè)電影的時(shí)間就是 攝入時(shí)間
- 不同的時(shí)間語義有不同的應(yīng)用場(chǎng)合
- 我們往往更關(guān)心事件時(shí)間(Event Time)
1.2 數(shù)據(jù)處理系統(tǒng)中的時(shí)間語義
- 在計(jì)算機(jī)系統(tǒng)中,考慮數(shù)據(jù)處理的“時(shí)代變化”是沒什么意義的,我們更關(guān)心的,顯然是數(shù)據(jù)本身產(chǎn)生的時(shí)間。
- 比如我們計(jì)算網(wǎng)站的 PV、UV 等指標(biāo),要統(tǒng)計(jì)每天的訪問量。
- 如果某個(gè)用戶在 23 點(diǎn) 59分 59 秒有一次訪問,但我們的任務(wù)處理這條數(shù)據(jù)的時(shí)間已經(jīng)是第二天 0 點(diǎn) 0 分 01 秒了;那么這條數(shù)據(jù),是應(yīng)該算作當(dāng)天的訪問,還是第二天的訪問呢?
- 很明顯,統(tǒng)計(jì)用戶行為,****需要考慮行為本身發(fā)生的時(shí)間,所以我們應(yīng)該把這條數(shù)據(jù)統(tǒng)計(jì)入當(dāng)天的訪問量。
- 這時(shí)我們用到的窗口,就是以事件時(shí)間作為劃分標(biāo)準(zhǔn)的,跟處理時(shí)間無關(guān)。
- 所以在實(shí)際應(yīng)用中,事件時(shí)間語義會(huì)更為常見。
- 一般情況下,業(yè)務(wù)日志數(shù)據(jù)中都會(huì)記錄數(shù)據(jù)生成的時(shí)間戳(timestamp),它就可以作為事件時(shí)間的判斷基礎(chǔ)。
1.3 Event Time、Processing Time、Ingestion Time
- 實(shí)際應(yīng)用中,數(shù)據(jù)產(chǎn)生的時(shí)間和處理的時(shí)間可能是完全不同的。
- 很長(zhǎng)時(shí)間收集起來的數(shù)據(jù),處理或許只要一瞬間;
- 也有可能數(shù)據(jù)量過大、處理能力不足,短時(shí)間堆了大量數(shù)據(jù)處理不完,產(chǎn)生“背壓”(back pressure)。
- 通常來說,處理時(shí)間是我們計(jì)算效率的衡量標(biāo)準(zhǔn),而事件時(shí)間會(huì)更符合我們的業(yè)務(wù)計(jì)算邏輯。
- 所以更多時(shí)候我們使用事件時(shí)間;
- 不過處理時(shí)間也不是一無是處。
- 對(duì)于處理時(shí)間而言,由于沒有任何附加考慮,數(shù)據(jù)一來就直接處理,因此這種方式可以讓我們的流處理延遲降到最低,效率達(dá)到最高。
- 但是我們前面提到過,在分布式環(huán)境中,處理時(shí)間其實(shí)是不確定的,各個(gè)并行任務(wù)時(shí)鐘不統(tǒng)一;
- 而且由于網(wǎng)絡(luò)延遲,導(dǎo)致數(shù)據(jù)到達(dá)各個(gè)算子任務(wù)的時(shí)間有快有慢,對(duì)于窗口操作就可能收集不到正確的數(shù)據(jù)了,數(shù)據(jù)處理的順序也會(huì)被打亂。這就會(huì)影響到計(jì)算結(jié)果的正確性。
- 所以處理時(shí)間語義,一般用在對(duì)實(shí)時(shí)性要求極高、而對(duì)計(jì)算準(zhǔn)確性要求不太高的場(chǎng)景。
- 而且由于網(wǎng)絡(luò)延遲,導(dǎo)致數(shù)據(jù)到達(dá)各個(gè)算子任務(wù)的時(shí)間有快有慢,對(duì)于窗口操作就可能收集不到正確的數(shù)據(jù)了,數(shù)據(jù)處理的順序也會(huì)被打亂。這就會(huì)影響到計(jì)算結(jié)果的正確性。
- 而在事件時(shí)間語義下,水位線成為了時(shí)鐘,可以統(tǒng)一控制時(shí)間的進(jìn)度。
- 這就保證了我們總可以將數(shù)據(jù)劃分到正確的窗口中,比如 8 點(diǎn) 59 分 59 秒產(chǎn)生的數(shù)據(jù),無論網(wǎng)絡(luò)傳輸?shù)难舆t是多少,它永遠(yuǎn)屬于 8 點(diǎn)~9 點(diǎn)的窗口,不會(huì)錯(cuò)分。
- 但我們知道數(shù)據(jù)還可能是亂序的,要想讓窗口正確地收集到所有數(shù)據(jù),就必須等這些錯(cuò)亂的數(shù)據(jù)都到齊,這就需要一定的等待時(shí)間。
- 所以整體上看,事件時(shí)間語義是以一定延遲為代價(jià),換來了處理結(jié)果的正確性。
- 由于網(wǎng)絡(luò)延遲一般只有毫秒級(jí),所以即使是事件時(shí)間語義,同樣可以完成低延遲實(shí)時(shí)流處理的任務(wù)。
- 另外,除了事件時(shí)間和處理時(shí)間,F(xiàn)link 還有一個(gè)“攝入時(shí)間”(Ingestion Time)的概念,它是指數(shù)據(jù)進(jìn)入 Flink 數(shù)據(jù)流的時(shí)間,也就是 Source 算子讀入數(shù)據(jù)的時(shí)間。
- 攝入時(shí)間相當(dāng)于是事件時(shí)間和處理時(shí)間的一個(gè)中和,它是把 Source 任務(wù)的處理時(shí)間,當(dāng)作了數(shù)據(jù)的產(chǎn)生時(shí)間添加到數(shù)據(jù)里。這樣一來,水位線(watermark)也就基于這個(gè)時(shí)間直接生成,不需要單獨(dú)指定了。
- 這種時(shí)間語義可以保證比較好的正確性,同時(shí)又不會(huì)引入太大的延遲。它的具體行為跟事件時(shí)間非常像,可以當(dāng)作特殊的事件時(shí)間來處理。
- 在 Flink 中,由于處理時(shí)間比較簡(jiǎn)單,早期版本默認(rèn)的時(shí)間語義是處理時(shí)間;而考慮到事件時(shí)間在實(shí)際應(yīng)用中更為廣泛,從 1.12 版本開始,F(xiàn)link 已經(jīng)將事件時(shí)間作為了默認(rèn)的時(shí)間語義。