1. 程式人生 > WINDOWS開發 >flink中Time和window

flink中Time和window

一、Time

技術分享圖片

(1)Even time

  1、Event Time 是事件發生的時間,一般就是資料本身攜帶的時間。這個時間通常是在事件到達 Flink 之前就確定的,並且可以從每個事件中獲取到事件時間戳。

  2、在 Event Time 中,時間取決於資料,而跟其他沒什麼關係。如果事件按照事件先後發生的順序到達,那麼處理 Event Time 將產生完全一致和確定的結果;否則處理 Event Time 時將會因為要等待一些無序事件而產生一些延遲。由於只能等待一段有限的時間,因此就難以保證處理 Event Time 將產生完全一致和確定的結果。

  3、Event Time 程式必須指定如何生成 Event Time 水印,這是表示 Event Time 進度的機制

(2)Ingestion Time

  1、Ingestion Time 是事件進入 Flink 的時間,在概念上位於 Event Time 和 Processing Time 之間。

  2、與 Event Time 相比,Ingestion Time 程式無法處理任何無序事件或延遲資料,但程式不必指定如何生成watermark。

  3、Ingestion Time 與 Event Time 非常相似,但 Ingestion Time 具有自動分配時間戳和自動生成watermark功能。

(3)procession time:Processing Time 是指事件被處理時機器的系統時間。

二、window

(1)window型別

  1、TimeWindow:按照時間生成Window

  2、CountWindow:按照指定的資料條數生成一個Window,與時間無關。

(2)time window的型別

  1、Tumbling Time Window(滾動視窗):假設統計每一分鐘中使用者購買的商品的總數,需要將使用者的行為事件按每一分鐘進行切分,這種切分被成為翻滾時間視窗,翻滾視窗能將資料流切分成不重疊的視窗,每一個事件只能屬於一個視窗。特點:將資料依據固定的視窗長度對資料進行切片;時間對齊,視窗長度固定,沒有重疊。

  val tumblingCnts= buyCnts.keyBy(0).timeWindow(Time.minutes(1)).sum(1)

技術分享圖片

  2、sliding time window(滑動視窗):對於某些應用,它們需要的視窗是不間斷的,需要平滑地進行視窗聚合。比如,我們可以每30秒計算一次最近一分鐘使用者購買的商品總數。這種視窗我們稱為滑動時間視窗(Sliding Time Window)。在滑窗中,一個元素可以對應多個視窗。特點:滑動視窗由固定的視窗長度和滑動間隔組成;時間對齊,視窗長度固定,有重疊。

   1)滑動視窗和滾動視窗的函式名是完全一致的,只是在傳引數時需要傳入兩個引數,一個是window_size,一個是sliding_size。

    val slidingCnts = buyCnts.keyBy(0).timeWindow(Time.minutes(1),Time.seconds(30)).sum(1)

技術分享圖片

  3、Session Windows(會話視窗):session視窗跟滾動視窗和滑動視窗相比,不會有重疊和固定的開始時間和結束時間的情況,相反,當它在一個固定的時間週期內不再收到元素,即非活動間隔產生,那個這個視窗就會關閉。特點:時間無對齊。由一系列事件組合一個指定時間長度的timeout間隙組成,類似於web應用的session,也就是一段時間沒有接收到新資料就會生成新的視窗。

  val sessionCnts: DataStream[(Int,Int)] = vehicleCnts.keyBy(0).window(ProcessingTimeSessionWindows.withGap(Time.seconds(30))).sum(1)

技術分享圖片

(3)CountWindow型別

  CountWindow根據視窗中相同key元素的數量來觸發執行,執行時只計算元素數量達到視窗大小的key對應的結果。注意: CountWindow的window_size指的是相同Key的元素的個數,不是輸入的所有元素的總數。如:windowSize=4,輸入(1,2,3,1,1)結果:(1,3),此時key為2和3的條數才1,達到4時才計算。

  1、滾動視窗:預設的CountWindow是一個滾動視窗,只需要指定視窗大小即可,當元素數量達到視窗大小時,就會觸發視窗的執行。

  2、滑動視窗:滑動視窗和滾動視窗的函式名是完全一致的,只是在傳引數時需要傳入兩個引數,一個是window_size:5,一個是sliding_size:2。若sliding_size設定為了2,也就是說,每收到兩個相同key的資料就計算一次,每一次計算的window範圍是5個元素。達到滑動步長的時候計算一次,達到滑動視窗大小的時候計算一次

三、解析windowAPI