Flink中的5種窗口使用場景

面試官有可能這么問:
1.Flink中對窗口的支持包括哪幾種?說說他們的使用場景


  1. flink支持兩種劃分窗口的方式(time和count) 如果根據(jù)時間劃分窗口,那么它就是一個time-window 如果根據(jù)數(shù)據(jù)劃分窗口,那么它就是一個count-window

  2. flink支持窗口的兩個重要屬性(size和interval)

  • 如果size=interval,那么就會形成tumbling-window(無重疊數(shù)據(jù))
  • 如果size>interval,那么就會形成sliding-window(有重疊數(shù)據(jù))
  • 如果size<interval,那么這種窗口將會丟失數(shù)據(jù)。比如每5秒鐘,統(tǒng)計過去3秒的通過路口汽車的數(shù)據(jù),將會漏掉2秒鐘的數(shù)據(jù)。
  1. 通過組合可以得出四種基本窗口:
  • time-tumbling-window 無重疊數(shù)據(jù)的時間窗口,設(shè)置方式舉例:timeWindow(Time.seconds(5))

  • time-sliding-window 有重疊數(shù)據(jù)的時間窗口,設(shè)置方式舉例:timeWindow(Time.seconds(5), Time.seconds(3))

  • count-tumbling-window無重疊數(shù)據(jù)的數(shù)量窗口,設(shè)置方式舉例:countWindow(5)

  • count-sliding-window 有重疊數(shù)據(jù)的數(shù)量窗口,設(shè)置方式舉例:countWindow(5,3)

  1. flink支持在stream上的通過key去區(qū)分多個窗口

窗口的實現(xiàn)方式
上一張經(jīng)典圖:

image
  • Tumbling Time Window
 假如我們需要統(tǒng)計每一分鐘中用戶購買的商品的總數(shù),
需要將用戶的行為事件按每一分鐘進行切分,
這種切分被成為翻滾時間窗口(Tumbling Time Window)。
翻滾窗口能將數(shù)據(jù)流切分成不重疊的窗口,
每一個事件只能屬于一個窗口。

// 用戶id和購買數(shù)量 stream
val counts: DataStream[(Int, Int)] = ...
val tumblingCnts: DataStream[(Int, Int)] = counts
  // 用userId分組
  .keyBy(0) 
  // 1分鐘的翻滾窗口寬度
  .timeWindow(Time.minutes(1))
  // 計算購買數(shù)量
  .sum(1) 

  • Sliding Time Window
 我們可以每30秒計算一次最近一分鐘用戶購買的商品總數(shù)。
這種窗口我們稱為滑動時間窗口(Sliding Time Window)。
在滑窗中,一個元素可以對應(yīng)多個窗口。通過使用 DataStream API,我們可以這樣實現(xiàn):

val slidingCnts: DataStream[(Int, Int)] = buyCnts
  .keyBy(0) 
  .timeWindow(Time.minutes(1), Time.seconds(30))
  .sum(1)

  • Tumbling Count Window
    當(dāng)我們想要每100個用戶購買行為事件統(tǒng)計購買總數(shù),那么每當(dāng)窗口中填滿100個元素了,就會對窗口進行計算,這種窗口我們稱之為翻滾計數(shù)窗口(Tumbling Count Window),上圖所示窗口大小為3個。通過使用 DataStream API,我們可以這樣實現(xiàn):
// Stream of (userId, buyCnts)
val buyCnts: DataStream[(Int, Int)] = ...

val tumblingCnts: DataStream[(Int, Int)] = buyCnts
  // key stream by sensorId
  .keyBy(0)
  // tumbling count window of 100 elements size
  .countWindow(100)
  // compute the buyCnt sum 
  .sum(1)

  • Session Window

在這種用戶交互事件流中,我們首先想到的是將事件聚合到會話窗口中(一段用戶持續(xù)活躍的周期),由非活躍的間隙分隔開。如上圖所示,就是需要計算每個用戶在活躍期間總共購買的商品數(shù)量,如果用戶30秒沒有活動則視為會話斷開(假設(shè)raw data stream是單個用戶的購買行為流)。Session Window 的示例代碼如下:

// Stream of (userId, buyCnts)
val buyCnts: DataStream[(Int, Int)] = ...

val sessionCnts: DataStream[(Int, Int)] = vehicleCnts
    .keyBy(0)
    // session window based on a 30 seconds session gap interval 
    .window(ProcessingTimeSessionWindows.withGap(Time.seconds(30)))
    .sum(1)

一般而言,window 是在無限的流上定義了一個有限的元素集合。這個集合可以是基于時間的,元素個數(shù)的,時間和個數(shù)結(jié)合的,會話間隙的,或者是自定義的。Flink 的 DataStream API 提供了簡潔的算子來滿足常用的窗口操作,同時提供了通用的窗口機制來允許用戶自己定義窗口分配邏輯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容