摘要:每小時窗口將包括在系統(tǒng)時鐘指示整個小時之間到達(dá)特定操作的所有事件。平行流中的水印水印是在源函數(shù)處生成的,或直接在源函數(shù)之后生成的。源函數(shù)的每個并行子任務(wù)通常獨(dú)立生成其水印。由于其輸入流更新其事件時間,因此操作員也是如此。
前言
Flink 在流程序中支持不同的 Time 概念,就比如有 Processing Time、Event Time 和 Ingestion Time。
下面我們一起來看看這幾個 Time:
Processing TimeProcessing Time 是指事件被處理時機(jī)器的系統(tǒng)時間。
當(dāng)流程序在 Processing Time 上運(yùn)行時,所有基于時間的操作(如時間窗口)將使用當(dāng)時機(jī)器的系統(tǒng)時間。每小時 Processing Time 窗口將包括在系統(tǒng)時鐘指示整個小時之間到達(dá)特定操作的所有事件。
例如,如果應(yīng)用程序在上午 9:15 開始運(yùn)行,則第一個每小時 Processing Time 窗口將包括在上午 9:15 到上午 10:00 之間處理的事件,下一個窗口將包括在上午 10:00 到 11:00 之間處理的事件。
Processing Time 是最簡單的 "Time" 概念,不需要流和機(jī)器之間的協(xié)調(diào),它提供了最好的性能和最低的延遲。但是,在分布式和異步的環(huán)境下,Processing Time 不能提供確定性,因?yàn)樗菀资艿绞录竭_(dá)系統(tǒng)的速度(例如從消息隊(duì)列)、事件在系統(tǒng)內(nèi)操作流動的速度以及中斷的影響。
Event TimeEvent Time 是事件發(fā)生的時間,一般就是數(shù)據(jù)本身攜帶的時間。這個時間通常是在事件到達(dá) Flink 之前就確定的,并且可以從每個事件中獲取到事件時間戳。在 Event Time 中,時間取決于數(shù)據(jù),而跟其他沒什么關(guān)系。Event Time 程序必須指定如何生成 Event Time 水印,這是表示 Event Time 進(jìn)度的機(jī)制。
完美的說,無論事件什么時候到達(dá)或者其怎么排序,最后處理 Event Time 將產(chǎn)生完全一致和確定的結(jié)果。但是,除非事件按照已知順序(按照事件的時間)到達(dá),否則處理 Event Time 時將會因?yàn)橐却恍o序事件而產(chǎn)生一些延遲。由于只能等待一段有限的時間,因此就難以保證處理 Event Time 將產(chǎn)生完全一致和確定的結(jié)果。
假設(shè)所有數(shù)據(jù)都已到達(dá), Event Time 操作將按照預(yù)期運(yùn)行,即使在處理無序事件、延遲事件、重新處理歷史數(shù)據(jù)時也會產(chǎn)生正確且一致的結(jié)果。 例如,每小時事件時間窗口將包含帶有落入該小時的事件時間戳的所有記錄,無論它們到達(dá)的順序如何。
請注意,有時當(dāng) Event Time 程序?qū)崟r處理實(shí)時數(shù)據(jù)時,它們將使用一些 Processing Time 操作,以確保它們及時進(jìn)行。
Ingestion TimeIngestion Time 是事件進(jìn)入 Flink 的時間。 在源操作處,每個事件將源的當(dāng)前時間作為時間戳,并且基于時間的操作(如時間窗口)會利用這個時間戳。
Ingestion Time 在概念上位于 Event Time 和 Processing Time 之間。 與 Processing Time 相比,它稍微貴一些,但結(jié)果更可預(yù)測。因?yàn)?Ingestion Time 使用穩(wěn)定的時間戳(在源處分配一次),所以對事件的不同窗口操作將引用相同的時間戳,而在 Processing Time 中,每個窗口操作符可以將事件分配給不同的窗口(基于機(jī)器系統(tǒng)時間和到達(dá)延遲)。
與 Event Time 相比,Ingestion Time 程序無法處理任何無序事件或延遲數(shù)據(jù),但程序不必指定如何生成水印。
在 Flink 中,,Ingestion Time 與 Event Time 非常相似,但 Ingestion Time 具有自動分配時間戳和自動生成水印功能。
說了這么多概念比較干澀,下面直接看圖:
設(shè)定時間特性Flink DataStream 程序的第一部分通常是設(shè)置基本時間特性。 該設(shè)置定義了數(shù)據(jù)流源的行為方式(例如:它們是否將分配時間戳),以及像 KeyedStream.timeWindow(Time.seconds(30)) 這樣的窗口操作應(yīng)該使用上面哪種時間概念。
以下示例顯示了一個 Flink 程序,該程序在每小時時間窗口中聚合事件。
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime); // 其他 // env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime); // env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); DataStreamEvent Time 和 Watermarksstream = env.addSource(new FlinkKafkaConsumer09 (topic, schema, props)); stream .keyBy( (event) -> event.getUser() ) .timeWindow(Time.hours(1)) .reduce( (a, b) -> a.add(b) ) .addSink(...);
注意:Flink 實(shí)現(xiàn)了數(shù)據(jù)流模型中的許多技術(shù)。有關(guān) Event Time 和 Watermarks 的詳細(xì)介紹,請查看以下文章:
[https://www.oreilly.com/ideas...]()
[https://research.google.com/p...]()
支持 Event Time 的流處理器需要一種方法來衡量 Event Time 的進(jìn)度。 例如,當(dāng) Event Time 超過一小時結(jié)束時,需要通知構(gòu)建每小時窗口的窗口操作符,以便操作員可以關(guān)閉正在進(jìn)行的窗口。
Event Time 可以獨(dú)立于 Processing Time 進(jìn)行。 例如,在一個程序中,操作員的當(dāng)前 Event Time 可能略微落后于 Processing Time (考慮到接收事件的延遲),而兩者都以相同的速度進(jìn)行。另一方面,另一個流程序可能只需要幾秒鐘的時間就可以處理完 Kafka Topic 中數(shù)周的 Event Time 數(shù)據(jù)。
Flink 中用于衡量 Event Time 進(jìn)度的機(jī)制是 Watermarks。 Watermarks 作為數(shù)據(jù)流的一部分流動并帶有時間戳 t。 Watermark(t)聲明 Event Time 已到達(dá)該流中的時間 t,這意味著流中不應(yīng)再有具有時間戳 t"<= t 的元素(即時間戳大于或等于水印的事件)
下圖顯示了帶有(邏輯)時間戳和內(nèi)聯(lián)水印的事件流。在本例中,事件是按順序排列的(相對于它們的時間戳),這意味著水印只是流中的周期性標(biāo)記。
Watermark 對于無序流是至關(guān)重要的,如下所示,其中事件不按時間戳排序。通常,Watermark 是一種聲明,通過流中的該點(diǎn),到達(dá)某個時間戳的所有事件都應(yīng)該到達(dá)。一旦水印到達(dá)操作員,操作員就可以將其內(nèi)部事件時間提前到水印的值。
平行流中的水印水印是在源函數(shù)處生成的,或直接在源函數(shù)之后生成的。源函數(shù)的每個并行子任務(wù)通常獨(dú)立生成其水印。這些水印定義了特定并行源處的事件時間。
當(dāng)水印通過流程序時,它們會提前到達(dá)操作人員處的事件時間。當(dāng)一個操作符提前它的事件時間時,它為它的后續(xù)操作符在下游生成一個新的水印。
一些操作員消耗多個輸入流; 例如,一個 union,或者跟隨 keyBy(...)或 partition(...)函數(shù)的運(yùn)算符。 這樣的操作員當(dāng)前事件時間是其輸入流的事件時間的最小值。 由于其輸入流更新其事件時間,因此操作員也是如此。
下圖顯示了流經(jīng)并行流的事件和水印的示例,以及跟蹤事件時間的運(yùn)算符。
參考https://github.com/zhisheng17...
關(guān)注我轉(zhuǎn)載請務(wù)必注明原創(chuàng)地址為:http://www.54tianzhisheng.cn/2018/12/11/Flink-time/
微信公眾號:zhisheng
另外我自己整理了些 Flink 的學(xué)習(xí)資料,目前已經(jīng)全部放到微信公眾號了。你可以加我的微信:zhisheng_tian,然后回復(fù)關(guān)鍵字:Flink 即可無條件獲取到。
Github 代碼倉庫https://github.com/zhisheng17/flink-learning/
以后這個項(xiàng)目的所有代碼都將放在這個倉庫里,包含了自己學(xué)習(xí) flink 的一些 demo 和博客
相關(guān)文章1、《從0到1學(xué)習(xí)Flink》—— Apache Flink 介紹
2、《從0到1學(xué)習(xí)Flink》—— Mac 上搭建 Flink 1.6.0 環(huán)境并構(gòu)建運(yùn)行簡單程序入門
3、《從0到1學(xué)習(xí)Flink》—— Flink 配置文件詳解
4、《從0到1學(xué)習(xí)Flink》—— Data Source 介紹
5、《從0到1學(xué)習(xí)Flink》—— 如何自定義 Data Source ?
6、《從0到1學(xué)習(xí)Flink》—— Data Sink 介紹
7、《從0到1學(xué)習(xí)Flink》—— 如何自定義 Data Sink ?
8、《從0到1學(xué)習(xí)Flink》—— Flink Data transformation(轉(zhuǎn)換)
9、《從0到1學(xué)習(xí)Flink》—— 介紹Flink中的Stream Windows
10、《從0到1學(xué)習(xí)Flink》—— Flink 中的幾種 Time 詳解
11、《從0到1學(xué)習(xí)Flink》—— Flink 寫入數(shù)據(jù)到 ElasticSearch
12、《從0到1學(xué)習(xí)Flink》—— Flink 項(xiàng)目如何運(yùn)行?
13、《從0到1學(xué)習(xí)Flink》—— Flink 寫入數(shù)據(jù)到 Kafka
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73000.html
摘要:在每個事件上,觸發(fā)器都可以決定觸發(fā)即清除刪除窗口并丟棄其內(nèi)容,或者啟動并清除窗口。請注意,指定的觸發(fā)器不會添加其他觸發(fā)條件,但會替換當(dāng)前觸發(fā)器。結(jié)論對于現(xiàn)代流處理器來說,支持連續(xù)數(shù)據(jù)流上的各種類型的窗口是必不可少的。 showImg(https://segmentfault.com/img/remote/1460000017892799?w=1280&h=720); 前言 目前有許多數(shù)...
showImg(https://segmentfault.com/img/remote/1460000019961426); 今天在 Apache Flink meetup ·北京站進(jìn)行 Flink 1.9 重大新特性進(jìn)行了講解,兩位講師分別是 戴資力/楊克特,zhisheng 我也從看完了整個 1.9 特性解讀的直播,預(yù)計(jì) Flink 1.9 版本正式發(fā)布時間大概是 7 月底 8 月初左右正式發(fā)...
閱讀 1887·2021-11-15 11:46
閱讀 1077·2021-10-26 09:49
閱讀 1819·2021-10-14 09:42
閱讀 3374·2021-09-26 09:55
閱讀 827·2019-08-30 13:58
閱讀 1024·2019-08-29 16:40
閱讀 3462·2019-08-26 10:27
閱讀 601·2019-08-23 18:18