為什么是Flink?

本篇講講Flink条获,主要有

  • 基于事件時(shí)間的消息處理機(jī)制
  • flink的容錯(cuò)機(jī)制

都說(shuō)flink很火忠荞,那么它到底有什么過(guò)人之處呢≡孪唬看了《Flink基礎(chǔ)教程》钻洒,總結(jié)一下。

  1. flink性能好锄开,市面上的測(cè)試結(jié)果顯示素标,流處理方面flink較storm有更好的表現(xiàn),甚至是在某些批處理上的性能測(cè)試中萍悴,flink竟然勝出了spark头遭。
  2. flink能滿足基于事件時(shí)間分析的需求,市面上應(yīng)該只此一家了癣诱。
  3. flink的容錯(cuò)處理機(jī)制计维,能保證exact once處理。

好了撕予,介紹完特性鲫惶,來(lái)逐條講講,首先看第二點(diǎn):

基于事件時(shí)間的消息處理機(jī)制

將這個(gè)機(jī)制之前实抡,首先了解下flink的3種時(shí)間概念

  1. 事件時(shí)間:消息在設(shè)備中的產(chǎn)生時(shí)間
  2. 攝入時(shí)間:消息進(jìn)入flink的時(shí)間
  3. 處理時(shí)間:消息被flink中特定操作處理的時(shí)間
    借用官網(wǎng)的圖來(lái)理解:


    image.png

那好欠母,基于事件時(shí)間處理到底什么意思。比如我要統(tǒng)計(jì)在2019/2/20 9:10-9:15產(chǎn)生的消息總數(shù)吆寨,那么消息發(fā)生到傳入flink肯定有延時(shí)赏淌,flink中可以基于窗口函數(shù)來(lái)實(shí)現(xiàn)某一時(shí)間段流數(shù)據(jù)的處理,那么問(wèn)題來(lái)了啄清,我這個(gè)窗口函數(shù)什么時(shí)候結(jié)束六水?

有些人肯定就會(huì)想,用系統(tǒng)時(shí)間不就行了辣卒,當(dāng)服務(wù)器的時(shí)間超過(guò)了9:15掷贾,這個(gè)窗口函數(shù)就可以觸發(fā)了呀,處理這個(gè)時(shí)間段的數(shù)據(jù)添寺】瓒ⅲ基于處理時(shí)間的消息處理就是這么做的(這也是flink默認(rèn)的處理機(jī)制)。但是消息到底flink是有網(wǎng)絡(luò)延遲的计露,可能我9:14產(chǎn)生的數(shù)據(jù),9:16才到達(dá)flink,如果按照上訴策略票罐,這個(gè)窗口函數(shù)已經(jīng)觸發(fā)了叉趣,下個(gè)窗口是9:15到9:20,也不會(huì)處理這個(gè)消息该押,所以這個(gè)消息就被丟棄了疗杉。那可如何是好?

于是蚕礼,flink引入了一個(gè)叫水友叹摺(watermark)的概念。水印的作用就是決定你這個(gè)窗口函數(shù)什么時(shí)候觸發(fā)奠蹬。

水印

水印說(shuō)白了就是每個(gè)消息的時(shí)間戳朝聋,但是一個(gè)window操作只有一個(gè)水印,這說(shuō)明水印不斷再更新囤躁,這個(gè)消息的時(shí)間戳和當(dāng)前窗口函數(shù)的水印比較選最大值(最遲的)如果后來(lái)的消息小于它冀痕,就是亂序的 。 水印更新的時(shí)機(jī)有兩種策略

  1. 周期性狸演,默認(rèn)200ms
  2. 基于事件觸發(fā)

在不考慮容忍延遲的時(shí)間言蛇,如果系統(tǒng)時(shí)間大于水印,窗口函數(shù)就會(huì)觸發(fā)宵距。
如果考慮容忍延遲時(shí)間腊尚,比如:

stream.allowedLateness(Time.seconds(2))

那么,這個(gè)窗口會(huì)在水印時(shí)間比原來(lái)的設(shè)定觸發(fā)的時(shí)間再多兩秒時(shí)觸發(fā)满哪,為了等待亂序的消息婿斥,犧牲點(diǎn)時(shí)間。

關(guān)于水印的詳解翩瓜,還可以參考https://juejin.im/post/5bf95810e51d452d705fef33受扳,里面有具體的例子。

前面提到很多次窗口兔跌,簡(jiǎn)單介紹下窗口

窗口

窗口就是勘高,對(duì)某一種范圍內(nèi)數(shù)據(jù)觸發(fā)一次函數(shù)處理,這個(gè)范圍可以是時(shí)間(某一時(shí)間段消息計(jì)數(shù))坟桅,也可以是數(shù)量(5個(gè)消息的總長(zhǎng)度)华望。

時(shí)間窗口

最簡(jiǎn)單有用的,支持滾動(dòng)和滑動(dòng)仅乓。

  1. 滾動(dòng):兩個(gè)窗口不重疊
stream.timeWindow(Time.minute(1))
  1. 滑動(dòng):兩個(gè)窗口會(huì)重疊赖舟,下述代碼表示2秒的時(shí)間窗口,每隔一秒滾動(dòng)一次夸楣。
stream.timeWindow(Time.minute(2)宾抓,Time.minute(1))
計(jì)數(shù)窗口

和上面類似子漩,也有滾動(dòng),滑動(dòng)

stream.countWindow(4石洗,2)
會(huì)話窗口
stream.window(SessionWindows.withGap(Time.minute(4)))
觸發(fā)器

窗口的觸發(fā)都是有觸發(fā)器完成的幢泼,例如上面基于事件時(shí)間的窗口,觸發(fā)條件就是根據(jù)水印判斷讲衫。用戶也可以自定義觸發(fā)器

基于事件時(shí)間的消息處理機(jī)制還是很好理解的缕棵,但是市面上好像還沒(méi)有類似的流處理引擎,大多是基于處理時(shí)間的涉兽。

flink的容錯(cuò)機(jī)制

分布式系統(tǒng)頭疼的一件事便是一致性問(wèn)題招驴。說(shuō)白了,就是系統(tǒng)故障修復(fù)后能還原到故障前的什么程度枷畏。

在流處理中别厘,一致性分為3個(gè)級(jí)別:

  1. at-most-once(可能少讀)
  2. at-least-once(可能重復(fù)讀)
  3. exactly-once (正好)

支持at-least-once的有Storm Trident和spark streaming,但是兩者在性能上的開銷太大了矿辽。它們通過(guò)微批處理來(lái)保證丹允,就是說(shuō),無(wú)法將消息單條處理袋倔,而是等待一批完全處理完雕蔽,下一批再處理,可想而知宾娜,增加了延時(shí)批狐。而flink牛逼的地方在于它不僅保證了exactly-once而且效率很高。 那它如何保證exactly-once的呢前塔?

checkpoint

熟悉spark的同學(xué)大概都知道這個(gè)概念嚣艇,spark可以將中間rdd的計(jì)算結(jié)果保存到磁盤中,下次通過(guò)該rdd的算子华弓,就不用從頭開始計(jì)算食零,直接從這個(gè)checkpoint開始計(jì)算。

flink消息中穿插了checkpoint消息寂屏,當(dāng)遇到該消息時(shí)贰谣,每個(gè)節(jié)點(diǎn)會(huì)將當(dāng)前消息偏移量(以kafka為例),該操作中間計(jì)算結(jié)果落盤迁霎。等到恢復(fù)時(shí)吱抚,直接從該checkpoint恢復(fù)。那么考廉,還是會(huì)可能出現(xiàn)checkpoint點(diǎn)到故障時(shí)這段時(shí)間的消息會(huì)被讀兩次啊秘豹,如果是寫入到數(shù)據(jù)庫(kù),那可能就會(huì)寫兩次了昌粤。那是如何exactly-once 的凹热啤啄刹?這就涉及到端到端的一致性問(wèn)題了,類似數(shù)據(jù)庫(kù)中的事務(wù)岸更。解決方法有兩種:

  1. 讀已提交鸵膏,flink sink(落盤)時(shí)維護(hù)一個(gè)緩沖區(qū)膊升,等到checkpoint時(shí)怎炊,再將緩沖區(qū)數(shù)據(jù)落盤(原子型操作)
  2. 讀未提交,以流式方式落盤廓译,可能會(huì)重復(fù)落盤评肆。當(dāng)故障時(shí),需要回滾非区。

本篇只是分析了flink兩個(gè)方面瓜挽,后續(xù)深入了解后再更新其他特性。
參考資料 :

  1. 《flink基礎(chǔ)教程》
  2. https://juejin.im/post/5bf95810e51d452d705fef33
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末征绸,一起剝皮案震驚了整個(gè)濱河市久橙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌管怠,老刑警劉巖淆衷,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渤弛,居然都是意外死亡祝拯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門她肯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佳头,“玉大人,你說(shuō)我怎么就攤上這事晴氨】导危” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵籽前,是天一觀的道長(zhǎng)亭珍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)聚假,這世上最難降的妖魔是什么块蚌? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮膘格,結(jié)果婚禮上峭范,老公的妹妹穿的比我還像新娘。我一直安慰自己瘪贱,他們只是感情好纱控,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布辆毡。 她就那樣靜靜地躺著,像睡著了一般甜害。 火紅的嫁衣襯著肌膚如雪舶掖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天尔店,我揣著相機(jī)與錄音眨攘,去河邊找鬼。 笑死嚣州,一個(gè)胖子當(dāng)著我的面吹牛鲫售,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播该肴,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼情竹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匀哄?” 一聲冷哼從身側(cè)響起秦效,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涎嚼,沒(méi)想到半個(gè)月后阱州,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铸抑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贡耽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹊汛。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒲赂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刁憋,到底是詐尸還是另有隱情滥嘴,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布至耻,位于F島的核電站若皱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尘颓。R本人自食惡果不足惜走触,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疤苹。 院中可真熱鬧互广,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至旅敷,卻和暖如春生棍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背媳谁。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工涂滴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人韩脑。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓氢妈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親段多。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容