flink kafka consumer解析

1. 涉及組件

FlinkKafkaConsumer是用戶使用Kafka作為Source進(jìn)行編程的入口装蓬,它有一個(gè)核心組件KafkaFetcher是趴,用來消費(fèi)kafka中的數(shù)據(jù)侍筛,并向下游發(fā)送接收到的數(shù)據(jù)钞脂,如果調(diào)用了FlinkKafkaConsumer#assignTimestampsAndWatermarks纵散,還負(fù)責(zé)WaterMark的發(fā)送圈驼,WaterMark是本篇文章的重點(diǎn)人芽。
我們先看下KafkaFetcher的組成

  • 消費(fèi)線程,用來構(gòu)建KafkaConsumer客戶端绩脆,向Kafka請(qǐng)求指定的分區(qū)數(shù)據(jù)萤厅,將獲取的批量數(shù)據(jù)ConsumerRecords放入到HandoverHanderover可以看成一個(gè)同步隊(duì)列靴迫,生成一個(gè)必須等到被消費(fèi)后才能再生產(chǎn)
  • 任務(wù)線程惕味,用來消費(fèi)Handerover中的數(shù)據(jù),將ConsumerRecords反序列化為一條條的數(shù)據(jù)玉锌,然后存儲(chǔ)在隊(duì)列ArrayDeque中赦拘,然后同一個(gè)循環(huán)來消費(fèi)該隊(duì)列中的消息,用來做三件事情(看圖吧芬沉,這里不寫了)
  • 在創(chuàng)建KafkaFetcher時(shí)躺同,會(huì)根據(jù)watermark的發(fā)送間隔,向timeService提交一個(gè)定時(shí)任務(wù)丸逸,定時(shí)的更新每個(gè)partition的watermark蹋艺,然后取各個(gè)partition中最小的watermark,作為任務(wù)的候選watermark進(jìn)行更新黄刚,如果更新成功則會(huì)向下游發(fā)送
    KafkaFetcher

2. WaterMark的傳播

下面是調(diào)用了FlinkKafkaConsumer#assignTimestampsAndWatermarks之后捎谨,KafkaFetcher中管理WaterMark的示意圖

  • 只是一個(gè)Task,該Task消費(fèi)2個(gè)分區(qū)
  • 更新每個(gè)分區(qū)的WaterMarkKafkaTopicPartitionStateWithWatermarkGenerator用來執(zhí)行WatermarkGenerator.onPeriodicEmit方法,并通過多路復(fù)用器WatermarkOutputMultiplexer將每個(gè)partition生成的WaterMark存儲(chǔ)到OutputState中涛救,當(dāng)新生成的WaterMark大于存儲(chǔ)在OutputState中的WaterMark時(shí)畏邢,則更新OutputState中的WaterMark
  • 更新Task WaterMark:通過多路復(fù)用器WatermarkOutputMultiplexer遍歷所有非IDLE狀態(tài)的OutputState的Watermark,取最小的作為最新的Task的WaterMark检吆,如果該值大于老的Task WaterMark舒萎,則更新并向下游發(fā)送
    watermark管理

2.1 WaterMark傳播可能產(chǎn)生的問題:Window算子不被觸發(fā)

示例

如圖,假設(shè)partition1沒有數(shù)據(jù)了蹭沛,它的watermark就不更新臂寝,則Task1由于Task WaterMark得不到更新,不往下面發(fā)送WM摊灭,而Task2發(fā)送WM(30)咆贬,下游任務(wù)接收后,也會(huì)取最小帚呼,還是10掏缎,這樣會(huì)導(dǎo)致下游的Window計(jì)算不會(huì)被觸發(fā)。
解決辦法assignTimestampsAndWatermarks.withIdleness(Duration.ofMinutes(1))煤杀,上面的是示例眷蜈,表示如果某個(gè)partition在1分鐘內(nèi)沒有數(shù)據(jù)可供消費(fèi)了,則將該partition置為IDLE怜珍,在更新Task WaterMark將該partition的WaterMark忽略。當(dāng)所有的partition都IDLE了凤粗,則會(huì)向下游發(fā)送StreamStatus.IDLE事件酥泛,接下來發(fā)生的事情可以參考flink解析:EventTime與Watermark

2.2 API使用不當(dāng)產(chǎn)生的問題:丟失數(shù)據(jù)

final FlinkKafkaConsumer<String> producer = new FlinkKafkaConsumer<>(sourceTopic, new SimpleStringSchema(), properties);    
env.addSource(producer).assignTimestampsAndWatermarks(getWatermarkStrategy()));

不是調(diào)用的FlinkKafkaConsumer#assignTimestampsAndWatermarks而是調(diào)用DataStreamSource#assignTimestampsAndWatermarks,可能會(huì)產(chǎn)生數(shù)據(jù)丟失的問題

示意圖
  • 代碼那樣寫嫌拣,consumer與assignTimestampsAndWatermarks就是2個(gè)operator了柔袁,WaterMark直接按照規(guī)則往下發(fā)了,當(dāng)40發(fā)過去后异逐,20過去就被當(dāng)成遲到數(shù)據(jù)了捶索,這需要注意
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灰瞻,隨后出現(xiàn)的幾起案子腥例,更是在濱河造成了極大的恐慌,老刑警劉巖酝润,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燎竖,死亡現(xiàn)場離奇詭異,居然都是意外死亡要销,警方通過查閱死者的電腦和手機(jī)构回,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纤掸,你說我怎么就攤上這事脐供。” “怎么了借跪?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵政己,是天一觀的道長。 經(jīng)常有香客問我垦梆,道長匹颤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任托猩,我火速辦了婚禮印蓖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘京腥。我一直安慰自己赦肃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布公浪。 她就那樣靜靜地躺著他宛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欠气。 梳的紋絲不亂的頭發(fā)上厅各,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音预柒,去河邊找鬼队塘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宜鸯,可吹牛的內(nèi)容都是我干的憔古。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼淋袖,長吁一口氣:“原來是場噩夢啊……” “哼鸿市!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起即碗,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤焰情,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剥懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙样,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蕊肥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谒获。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤肌。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖批狱,靈堂內(nèi)的尸體忽然破棺而出裸准,到底是詐尸還是另有隱情,我是刑警寧澤赔硫,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布炒俱,位于F島的核電站,受9級(jí)特大地震影響爪膊,放射性物質(zhì)發(fā)生泄漏权悟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一推盛、第九天 我趴在偏房一處隱蔽的房頂上張望峦阁。 院中可真熱鬧,春花似錦耘成、人聲如沸榔昔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撒会。三九已至,卻和暖如春师妙,著一層夾襖步出監(jiān)牢的瞬間诵肛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工默穴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怔檩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓壁顶,卻偏偏與公主長得像珠洗,于是被迫代替她去往敵國和親溜歪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子若专,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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