聊聊Apache Flink中的Watermark

注:本文轉(zhuǎn)自我的個人博客龄章。

Watermark是流式處理中的一個基礎(chǔ)概念乞封,關(guān)于Watermark的概念有很多做裙,在這里不做闡述。

Watermark特性

這不是官方的表述肃晚,我根據(jù)自己的認(rèn)知覺得Watermark有以下幾個特點:

  • 基于已有數(shù)據(jù)生成Watermark锚贱,Apache Flink生成Watermark有Punctuated和Periodic兩種方式,但大多數(shù)人的使用方法都是基于已有數(shù)據(jù)生成Watermark关串。這個會給我們帶來一定的問題,這個在后面講到吧碾。
  • 只允許遞增。這個特性讓我們需要對可能產(chǎn)生"臟"Watermark的情況進行判斷倦春,比如需不需要對出現(xiàn)的未來時間做處理等落剪。
  • StreamInputProcessor從多個channel中收到的多個Watermark取最小值傳遞給下游算子。這也可能成為在數(shù)據(jù)傾斜時忠怖,導(dǎo)致程序OOM掛掉的原因之一呢堰。

isWatermarkAligned

在Watermark相關(guān)源碼中經(jīng)衬杂郑可以看到Watermark對齊的判斷,如果各個子任務(wù)中的Watermark都對齊的話往衷,那是最理想的情況严卖。然而實際生產(chǎn)中席舍,總會很多意外哮笆。這里有兩個極端的例子。

一條數(shù)據(jù)流長時間沒有數(shù)據(jù)福铅,其他流數(shù)據(jù)正常项阴。

出現(xiàn)這種情況的原因有很多滑黔,比如數(shù)據(jù)本身是波峰狀环揽,數(shù)據(jù)被上游算子過濾掉等。剛剛提到汛兜,下游算子的Watermark取決于多個上游算子Watermark的最小值,那么如果一條數(shù)據(jù)流長時間沒有數(shù)據(jù)粥谬,豈不是會造成Watermark一直停留在原地不動的情況衡创?

Flink-IdleTimeout
Flink-IdleTimeout

當(dāng)然不會,針對這種情況璃氢,F(xiàn)link在數(shù)據(jù)流中實現(xiàn)了一個Idle的概念。 用戶首先需要設(shè)置timeout(IdleTimeout)巢寡,這個timeout表示數(shù)據(jù)源在多久沒有收到數(shù)據(jù)后椰苟,數(shù)據(jù)流要判斷為Idle抑月,下游Window算子在接收到Idle狀態(tài)后舆蝴,將不再使用這個Channel之前留下的Watermark题诵,而用其他Active Channel發(fā)送的Watermark數(shù)據(jù)來計算层皱。
如上圖所示,Source(1)在接收到數(shù)據(jù)后叫胖,會觸發(fā)生成一個timeout之后調(diào)用的callback,如果在timeout時間長度中怎棱,沒有再接收新的數(shù)據(jù)绷跑,便會向下游發(fā)送Idle狀態(tài),將自己標(biāo)識為Idle砸捏。

數(shù)據(jù)傾斜。

假設(shè)單條數(shù)據(jù)流傾斜带膜,那么該數(shù)據(jù)流中處理的數(shù)據(jù)所帶的時間戳,是遠(yuǎn)低于其他數(shù)據(jù)流中事件的時間戳式廷。

Flink-DataSkew
Flink-DataSkew

如圖所示芭挽,假設(shè)Watermark設(shè)置為收到的時間戳-1,那么Window的Watermark始終都保持在0袜爪,這會導(dǎo)致Window存儲大量的窗口,并且窗口狀態(tài)無法釋放辛馆,極有可能出現(xiàn)OOM。這個問題目前沒有好的解決辦法腊状,需要具體情況具體分析了苔可。

State Of WatermarkOperator

stream.assignTimestampsAndWatermarks(new AssignerWithPeriodicWatermarks[PatternWrapper] {
    override def getCurrentWatermark: Watermark = new Watermark(System.currentTimeMillis() - 15000)

    override def extractTimestamp(element: PatternWrapper, previousElementTimestamp: Long): Long = {
      System.currentTimeMillis()
    }
})

我們都知道,用戶可以通過顯式調(diào)用這種方法來實現(xiàn)Watermark焚辅,那么對于這種方法苟鸯,本質(zhì)上是生成了一個WatermarkOperator棚点,并且在Operator中計算Watermark傳遞給下游的算子。

此時問題來了乙濒,剛剛提到Watermark是由已有數(shù)據(jù)產(chǎn)生的卵蛉,那么在程序剛恢復(fù)還沒有發(fā)送數(shù)據(jù)的時候怎么辦?當(dāng)然不能選擇當(dāng)前時間甘有,這樣的話,稍晚一點的事件就被過濾掉了亏掀。

這就引出一個問題泛释,Watermark是不會存儲在Checkpoint中的,也就是說WatermarkOperator是一個無狀態(tài)算子怜校,那么程序啟動時,F(xiàn)link自身的邏輯是初始化Watermark為Long.MIN_VALUE茄茁。由于我們架構(gòu)設(shè)計的原因,對臟數(shù)據(jù)非常敏感付燥,不允許發(fā)送過于久的歷史數(shù)據(jù)愈犹,于是我們將WatermarkOperator的算子改成了有狀態(tài)的算子,其中為了兼容并行度scale的情況漩怎,我們將Watermark設(shè)置為所有數(shù)據(jù)流中Watermark的最小值。具體的JIRA可以看FLINK-5601中提出的一些方案和代碼改動扬卷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怪得,隨后出現(xiàn)的幾起案子卑硫,更是在濱河造成了極大的恐慌蚕断,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硝拧,死亡現(xiàn)場離奇詭異葛假,居然都是意外死亡障陶,警方通過查閱死者的電腦和手機聊训,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門带斑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勋磕,你說我怎么就攤上這事」易遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵墓毒,是天一觀的道長亲怠。 經(jīng)常有香客問我,道長团秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任踪栋,我火速辦了婚禮图毕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘予颤。我一直安慰自己冬阳,他們只是感情好党饮,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刑顺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狼讨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音能犯,去河邊找鬼犬耻。 笑死踩晶,一個胖子當(dāng)著我的面吹牛枕磁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播计济,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沦寂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了传藏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤哭靖,失蹤者是張志新(化名)和其女友劉穎侈离,沒想到半個月后试幽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卦碾,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡饰及,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年燎含,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屏箍。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡橘忱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钝诚,到底是詐尸還是另有隱情,我是刑警寧澤凝颇,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布拧略,位于F島的核電站,受9級特大地震影響垫蛆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袱饭,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舀透。 院中可真熱鬧决左,春花似錦愕够、人聲如沸佛猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至幻锁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哄尔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工富拗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啃沪。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓窄锅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親入偷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354