來源:北大青鳥總部 2023年06月27日 09:19
2020年天貓雙十一全球狂歡季成交額4982億元人民幣。在那年的整個(gè)雙十一中,我們通過Dashboard實(shí)時(shí)數(shù)據(jù)大盤可以知道每分鐘的成交額、訂單數(shù)、爆款商品、爆款售賣地區(qū)等等,這個(gè)Dashboard背后的技術(shù)便是數(shù)據(jù)實(shí)時(shí)計(jì)算和流式計(jì)算。
所謂實(shí)時(shí)計(jì)算指的是實(shí)時(shí)可以獲取到想要的數(shù)據(jù),比如我想查詢我今年雙十一的購買額,輸入姓名、時(shí)間后立即可以統(tǒng)計(jì)出數(shù)據(jù),所謂流式計(jì)算指的是我每買一件東西,購買量自動(dòng)加1,訂單額自動(dòng)增加。實(shí)時(shí)計(jì)算和流式計(jì)算都是相對離線計(jì)算的改善,離線計(jì)算有一定的延遲,它把數(shù)據(jù)從存儲(chǔ)中取出來,進(jìn)行統(tǒng)計(jì),最后再呈現(xiàn)。
我們在雙十一成交額大盤所看到的便是實(shí)時(shí)計(jì)算與流式計(jì)算的結(jié)合,實(shí)現(xiàn)流式計(jì)算的技術(shù)有很多,比如storm、spark、flink,而這其中最流行、使用最廣的便是flink,接下來我們就一起來看看flink到底是什么技術(shù)?
Flink是一個(gè)針對流數(shù)據(jù)、批數(shù)據(jù)進(jìn)行處理的分布式處理引擎,可以處理有界限的數(shù)據(jù)(數(shù)據(jù)量有限,不會(huì)改變的數(shù)據(jù)集合,比如雙十一當(dāng)天數(shù)據(jù)量)、無界限的數(shù)據(jù)(比如淘寶用戶產(chǎn)生的實(shí)時(shí)交互數(shù)據(jù)、股票市場的實(shí)時(shí)交易記錄)。在Flink的架構(gòu)中包含四層,分別是Deploy部署層、Core核心層、API接口層、Lib擴(kuò)展庫層。
在部署層主要是Flink的部署模式,它支持Local本地化部署,直接在IDE代碼編輯器中就可以運(yùn)行程序;也支持集群化部署,在Kubernetes或使用Hadoop的Yarn來做集群調(diào)度;也支持云上部署,通過彈性主機(jī)實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。在Core核心層,主要是分布式流式處理引擎,支持分布式stream處理,支持jobgraph到execution的映射調(diào)度,支持上層API接口的任務(wù)。在API層主要是提供API給到開發(fā)者編寫分布式任務(wù),包含DataSetAPI、DataStreamAPI兩類API,DataStreamAPI主要用于對流數(shù)據(jù)進(jìn)行處理,它可以將流式數(shù)據(jù)抽象成分布式的數(shù)據(jù)流,開發(fā)者就很方便的對分布式數(shù)據(jù)流進(jìn)行操作處理,DataSetAPI主要對于數(shù)據(jù)進(jìn)行批量處理,將靜態(tài)的、有限的數(shù)據(jù)抽象成分布式的數(shù)據(jù)集處理。在Lib擴(kuò)展庫層主要是通過擴(kuò)展庫方式提供更多使用場景給到開發(fā)者,比如CEP復(fù)雜事件處理、Table把結(jié)構(gòu)化數(shù)據(jù)抽象成關(guān)系表,并支持類SQL語句查詢、FlinkML支持機(jī)器學(xué)習(xí)、Gelly圖計(jì)算庫支持圖處理。
了解完Flink的基礎(chǔ)框架之后,我們再來看看Flink的基本編程模型是怎么樣的?在Flink中主要是三個(gè)步驟,數(shù)據(jù)源進(jìn)行數(shù)據(jù)輸入、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)輸出,開發(fā)者可以把數(shù)據(jù)庫的數(shù)據(jù)或自己本地文件數(shù)據(jù)或消息隊(duì)列Kafka的數(shù)據(jù)通過API接口傳遞給到Flink,F(xiàn)link處理引擎將數(shù)據(jù)轉(zhuǎn)化成按時(shí)間窗口排序或按最熱門排序或按地區(qū)聚合等數(shù)據(jù),最后再通過Sink將數(shù)據(jù)輸出到消息隊(duì)列或數(shù)據(jù)大盤中進(jìn)行展示。
在Flink的處理引擎中,數(shù)據(jù)是這樣進(jìn)行流轉(zhuǎn),開發(fā)者編寫Flink應(yīng)用程序代碼,通過Client傳遞給到JobManager,JobManager是Flink的Master節(jié)點(diǎn),負(fù)責(zé)安排任務(wù)給到TaskManager去執(zhí)行,同時(shí)管理TaskManager節(jié)點(diǎn)的調(diào)度情況,如果忙不過來或者故障,再把任務(wù)分配給到其它的TaskManager。TaskManager主要負(fù)責(zé)接收來自JobManager的任務(wù),一個(gè)TaskManager占據(jù)一個(gè)JVM內(nèi)存,在TaskManager中還包含TaskSlot的概念,用于內(nèi)存分配管理,一個(gè)Slot代表為其分配100%的內(nèi)存空間,兩個(gè)則代表為每個(gè)分配50%的空間,每個(gè)Slot占據(jù)1個(gè)線程來具體的執(zhí)行任務(wù)。
在DevOps工程師文化、Kubernetes容器技術(shù)盛行的互聯(lián)網(wǎng),F(xiàn)link也可以聯(lián)同二者進(jìn)行工作,尤其是在大廠,基本都是這樣的架構(gòu)運(yùn)行原理。開發(fā)人員編寫好Flink任務(wù)代碼,通過Git的push事件進(jìn)行代碼提交,同時(shí)觸發(fā)了對應(yīng)的Jenkins集群,在Kubernetes中進(jìn)行JobManager、TaskManager的部署,JobManager和TaskManager占據(jù)一個(gè)或多個(gè)POD,實(shí)現(xiàn)了自動(dòng)彈性伸縮,開發(fā)者或運(yùn)維人員基于Kubernetes還可以調(diào)度管理Flink系統(tǒng)。
本文介紹了Flink的基本架構(gòu)、編程模型、運(yùn)行原理,它還有很多應(yīng)用場景。我們抽象的從三個(gè)維度來看:
1、基于事件驅(qū)動(dòng),開發(fā)者將采集的事件不斷放入消息隊(duì)列,F(xiàn)link不斷的進(jìn)行消息隊(duì)列數(shù)據(jù)消費(fèi),每消費(fèi)一條數(shù)據(jù),則觸發(fā)一個(gè)動(dòng)作,在欺詐檢測、異常檢測、基于規(guī)則的告警、業(yè)務(wù)流程監(jiān)控中都可以使用Flink的這個(gè)特性;
2、分析場景,開發(fā)者將數(shù)據(jù)實(shí)時(shí)或周期性的寫入消息隊(duì)列,F(xiàn)link不斷的將應(yīng)用源數(shù)據(jù)做實(shí)時(shí)計(jì)算,不斷更新數(shù)據(jù)庫或HDFS,最后做大屏展示或數(shù)據(jù)報(bào)表,比如雙十一的DashBoard;
3、管道式ETL,即提取數(shù)據(jù)放到數(shù)據(jù)庫或文件系統(tǒng)當(dāng)中。下圖是Flink在阿里巴巴內(nèi)部的主要應(yīng)用場景。
除了阿里之外,在百度、騰訊、美團(tuán)、滴滴、頭條、京東、拼多多等公司,F(xiàn)link的應(yīng)用也是非常普及的。在互聯(lián)網(wǎng)流量為王時(shí)代,基于大數(shù)據(jù)去做離線分析、實(shí)時(shí)分析是必不可少的,數(shù)據(jù)開發(fā)工程師的薪酬也非??扇耍?span style="font-synthesis: style; font-weight: 600;">掌握Flink基礎(chǔ)使用知識也是必備技能,如果你對大數(shù)據(jù)開發(fā)感興趣,那么趕快學(xué)習(xí)上車Flink吧~