Flink學(xué)習(xí)筆記:時間與窗口
1. 時間
在flink中定義了三類時間:
- 事件時間(Event Time):即事件實際發(fā)生的時間润努。
- 處理時間(Processing Time):事件被處理的時間。
- 進(jìn)入時間(Ingestion Time):事件進(jìn)入流處理框架的時間
下圖很好的說明了三種時間的區(qū)別與聯(lián)系
其中時間時間和處理時間是比較常用,根據(jù)應(yīng)用程序的不同以及結(jié)果準(zhǔn)確性要求可以定義不同的時間,在flink中應(yīng)用程序中應(yīng)當(dāng)顯示的定義時間特征
// 顯示設(shè)置flink 時間特征:IngestionTime 、EventTime耳舅、ProcessingTime
// 如果不設(shè)置 默認(rèn)為 ProcessingTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
當(dāng)采用事件時間定義窗口時,可以利用flink的WaterMark機(jī)制處理亂序時間流倚评。
2. 窗口
窗口時flink中的一類算子浦徊,是DataStream的邏輯邊界,用于將許多事件按照時間或者其他特征分組天梧,從而將每一組作為整體進(jìn)行分析盔性。在開發(fā)中最常用的是時間窗口和計數(shù)窗口。
2.1 時間窗口
2.1.1 滾動窗口
滾動窗口設(shè)置
val dataSource: DataStream[(Int, Int )] = env.addSource(kafkaConsumer)
.map(...)
// 設(shè)置處理時間長度為30s的滾動窗口呢岗,也可以定義為事件時間的窗口 TumblingEventTimeWindows
dataSource.keyBy(0)
.window( TumblingProcessingTimeWindows.of( Time.seconds(30)) )
// 也可以這樣寫
dataSource.keyBy(0)
.timeWindow(Time.seconds(30))
2.1.2滑動窗口
滑動窗口設(shè)置
// 設(shè)置處理時間滑動窗口:窗口長度為30s冕香,步長5s
dataSource.keyBy(0)
.window(TumblingProcessingTimeWindows.of(Time.seconds(30),Time.seconds(5)))
.sum(1)
dataSource.keyBy(0)
.timeWindow(Time.seconds(30),Time.seconds(5))
.sum(1)
滾動窗口和滑動窗口的區(qū)別在于滑動窗口的窗口在不同時間區(qū)間之間有重疊。
2.2 計數(shù)窗口
計數(shù)窗口與時間窗口相似后豫,只不過分組依據(jù)不在是時間而是元素的數(shù)量悉尾,計數(shù)窗口也分為滾動計數(shù)窗口與滑動計數(shù)窗口,但是在使用計數(shù)窗口時需要注意的是挫酿,只有當(dāng)元素的個數(shù)滿足設(shè)定的窗口長度時才會觸發(fā)該窗口的計算构眯,如果不滿足元素個數(shù),則該窗口就不會觸發(fā)計算早龟,窗口長時間占用資源會就會造成資源浪費惫霸。一種解決辦法是用時間窗口來觸發(fā)超時。
// 設(shè)置窗口長度為10滾動計數(shù)窗口
dataSource.keyBy(0).countWindow(10).sum(1)
// 設(shè)置窗口長度為10拄衰,步長為2的滑動計數(shù)窗口
dataSource.keyBy(0).countWindow(10,2).sum(1)
3 其他窗口
flink除了提供時間窗口和計數(shù)窗口它褪,還提供了會話窗口,會話(session)是指一段持續(xù)活躍的期間翘悉,由活躍間隙分隔開茫打,一個session沒有固定的時長和步長,需要自己定義處理機(jī)制。例如同樣是在網(wǎng)站購買商品老赤,有的人經(jīng)過 搜索 -> 點擊 -> 購買 這三個步驟完成一次訂單交易轮洋,耗時可能很長,也可能很短抬旺;有的人則是經(jīng)過 搜索 -> 點擊 -> 查看 ->客服溝通...購買 一系列的操作之后才完成的一次訂單交易弊予。更詳細(xì)的講解介紹可以參考以下兩篇文章:Flink 原理與實現(xiàn):Session Window、Flink流計算編程--看看別人怎么用Session Window开财。與此同時汉柒,為了滿足某些特殊的需求,F(xiàn)link還可以通過自定義window來實現(xiàn)责鳍。
參考資料
https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/event_time.html
Flink 基礎(chǔ)教程
http://wuchong.me/blog/2016/06/06/flink-internals-session-window/#more
https://blog.csdn.net/lmalds/article/details/69267056