得益于其強(qiáng)大的可擴(kuò)展性,Apache Flink 在開發(fā)并運(yùn)行各種不同類型的應(yīng)用方面都是一個(gè)不錯(cuò)的選擇,這些特性包括:
- 對(duì)流處理與批處理的支持
- 復(fù)雜狀態(tài)管理
- 事件-時(shí)間型的處理方法
- 狀態(tài)的持續(xù)唯一性保證
不僅如此躯畴,F(xiàn)link 還可以部署在各種各樣的資源管理平臺(tái),如YARN山林、Apache Mesos 以及 Kubernetes润脸,同時(shí)也支持在邏輯上獨(dú)立運(yùn)行為一個(gè)集群漠魏。即便是高可用方面倔矾,F(xiàn)link 也無可挑剔。事實(shí)證明蛉幸,F(xiàn)link 可以擴(kuò)展到成千上萬個(gè)內(nèi)核破讨,處理TB量級(jí)的應(yīng)用狀態(tài),高吞吐奕纫,低時(shí)延提陶,同時(shí)能夠hold得住世上大部分流處理應(yīng)用。
接下來匹层,我們會(huì)探索基于Flink 實(shí)現(xiàn)的最常見的幾種應(yīng)用隙笆,并給一些真實(shí)的案例。
- 事件驅(qū)動(dòng)型應(yīng)用(Event-Driven Applications)
- 數(shù)據(jù)分析型應(yīng)用(Data Analytics Applications)
- 數(shù)據(jù)流水線型應(yīng)用(Data Pipeline Applications)
事件驅(qū)動(dòng)型應(yīng)用(Event-driven Applications)
什么是事件驅(qū)動(dòng)型應(yīng)用升筏?
一個(gè)事件驅(qū)動(dòng)型應(yīng)用往往是一個(gè)有狀態(tài)的應(yīng)用撑柔,該應(yīng)用從一個(gè)或多個(gè)事件流源接受事件,并且通過進(jìn)行相應(yīng)的計(jì)算您访、狀態(tài)變更以及其他操作來對(duì)這些事件做出響應(yīng)铅忿。
相比傳統(tǒng)的應(yīng)用設(shè)計(jì),事件驅(qū)動(dòng)型應(yīng)用無疑是一個(gè)革命灵汪。在傳統(tǒng)場(chǎng)景中檀训,計(jì)算和存儲(chǔ)是分開的,應(yīng)用程序從遠(yuǎn)程事務(wù)數(shù)據(jù)庫讀取數(shù)據(jù)并將數(shù)據(jù)持久化到該數(shù)據(jù)庫享言。而事件驅(qū)動(dòng)型應(yīng)用恰恰相反峻凫,它基于一些有狀態(tài)的流處理應(yīng)用,數(shù)據(jù)和計(jì)算資源位于一處览露,從而可以實(shí)現(xiàn)本地?cái)?shù)據(jù)訪問(從內(nèi)存或本地磁盤)荧琼。在處理期間,會(huì)周期性的拉取本地狀態(tài)并同步寫入遠(yuǎn)端一個(gè)位置來實(shí)現(xiàn)容錯(cuò)性這一特征。下面的圖表揭示了傳統(tǒng)型架構(gòu)與事件驅(qū)動(dòng)型應(yīng)用架構(gòu)的不同:
事件驅(qū)動(dòng)型應(yīng)用的好處命锄?
高吞吐堰乔、低時(shí)延:相比傳統(tǒng)方式中先存到遠(yuǎn)程數(shù)據(jù)庫,再讀取進(jìn)行處理累舷,事件驅(qū)動(dòng)型應(yīng)用直接本地訪問事件浩考,并直接處理夹孔,從而帶來更好的表現(xiàn)被盈。
容錯(cuò)性設(shè)計(jì):周期性檢查本地任務(wù)狀態(tài)并異步奸焙、增量地更新到遠(yuǎn)端持久層狂票。因此型将,檢查點(diǎn)對(duì)常規(guī)事件處理的影響非常小纸淮。
事件驅(qū)動(dòng)型應(yīng)用的好處不僅是提供本地?cái)?shù)據(jù)訪問這一點(diǎn)奄喂,在傳統(tǒng)架構(gòu)中梳杏,多個(gè)應(yīng)用往往共享一個(gè)數(shù)據(jù)庫實(shí)例们童,因此每當(dāng)有數(shù)據(jù)結(jié)構(gòu)變更時(shí)权谁,其他服務(wù)往往都需要做一定的配合拍鲤,或者實(shí)例擴(kuò)容情況出現(xiàn)時(shí)贴谎,其他服務(wù)訪問數(shù)據(jù)庫也會(huì)受到一定的性能影響。然而季稳,本地化的數(shù)據(jù)訪問模式擅这,使得事件驅(qū)動(dòng)型應(yīng)用只需要負(fù)責(zé)自己的數(shù)據(jù)即可,數(shù)據(jù)結(jié)構(gòu)的變更以及本應(yīng)用的擴(kuò)容操作也只需要較少的協(xié)同操作景鼠。
Flink 是如何支持事件驅(qū)動(dòng)型應(yīng)用的仲翎?
事件驅(qū)動(dòng)應(yīng)用程序的限制由流處理器處理時(shí)間和狀態(tài)的能力來定義。Flink的許多突出特征都集中在這些概念上铛漓。Flink提供了一組豐富的狀態(tài)原語溯香,可以管理非常大的數(shù)據(jù)卷(最多可達(dá)幾TB),并且精確地保證了一致性浓恶。此外玫坛,F(xiàn)link支持事件時(shí)間、高度可定制的窗口邏輯和ProcessFunction提供的細(xì)粒度時(shí)間控制包晰,從而實(shí)現(xiàn)了高級(jí)業(yè)務(wù)邏輯湿镀。此外,F(xiàn)link還提供了一個(gè)用于復(fù)雜事件處理(CEP)的庫杜窄,用于檢測(cè)數(shù)據(jù)流中的模式肠骆。
然而,F(xiàn)link對(duì)于事件驅(qū)動(dòng)應(yīng)用程序的突出特性是savepoint塞耕。保存點(diǎn)是一個(gè)一致的狀態(tài)鏡像蚀腿,可以用作兼容應(yīng)用程序的起點(diǎn)。給定一個(gè)保存點(diǎn),應(yīng)用程序可以更新或調(diào)整其規(guī)模莉钙,或者可以啟動(dòng)多個(gè)應(yīng)用程序版本以進(jìn)行A/B測(cè)試廓脆。
數(shù)據(jù)分析型應(yīng)用(Data-Analytics Applications)
什么是數(shù)據(jù)分析型應(yīng)用?
分析工作從源數(shù)據(jù)中抽取并洞察信息磁玉。在傳統(tǒng)架構(gòu)中停忿,分析工作往往是基于一個(gè)有限的數(shù)據(jù)集來做批量查詢。如果想要得到最新數(shù)據(jù)的結(jié)果蚊伞,需要不斷地把新數(shù)據(jù)增量加進(jìn)去再做分析工作席赂。結(jié)果會(huì)寫到存儲(chǔ)系統(tǒng)中,或者生成報(bào)告时迫。
但是颅停,借助一復(fù)雜流處理引擎,分析工作可以實(shí)時(shí)運(yùn)行掠拳。在這種模式下癞揉,應(yīng)用接收實(shí)時(shí)數(shù)據(jù),并且隨著新數(shù)據(jù)被消費(fèi)溺欧,持續(xù)產(chǎn)生新的結(jié)果喊熟。這些結(jié)果要么寫到一個(gè)外部數(shù)據(jù)庫,要么以內(nèi)部狀態(tài)被維護(hù)起來姐刁。報(bào)表應(yīng)用可以直接從外部數(shù)據(jù)庫或者從本地應(yīng)用讀取最新的數(shù)據(jù)芥牌。Apache Flink 同時(shí)支持批處理分析以及流處理分析:
流分析應(yīng)用的好處是什么?
批處理架構(gòu)往往由幾個(gè)獨(dú)立的組件組成:
- 周期性拉取數(shù)據(jù)
- 執(zhí)行查詢操作
這些操作帶來了時(shí)間開銷龙填,一旦某個(gè)環(huán)節(jié)出錯(cuò)就會(huì)影響整體胳泉。而基于復(fù)雜流處理引擎(如:Flink )的應(yīng)用把所有步驟合并到一起:數(shù)據(jù)抓取、持續(xù)結(jié)果計(jì)算岩遗,因此避開了各出錯(cuò)環(huán)節(jié)扇商,同時(shí)可以依賴引擎的錯(cuò)誤恢復(fù)機(jī)制。
Flink 是如何支持?jǐn)?shù)據(jù)分析應(yīng)用型應(yīng)用的宿礁?
Flink 對(duì)持續(xù)的流處理以及批處理都支持得很好案铺。具體來說,它具有一個(gè)符合ANSI標(biāo)準(zhǔn)的SQL接口梆靖,該接口具有用于批處理和流式查詢的統(tǒng)一語義控汉。不管是查詢靜態(tài)事件記錄數(shù)據(jù)集,還是查詢實(shí)時(shí)事件流返吻,該接口都能計(jì)算出相同的結(jié)果姑子。豐富的自定義函數(shù)使得用戶能夠在SQL查詢中執(zhí)行自己的代碼。如果需要更加定制化的處理邏輯测僵,F(xiàn)link 的DataStream API 或者DataSet API 也能夠提供初級(jí)的控制支持街佑。此外谢翎,F(xiàn)link的Gelly庫為批量數(shù)據(jù)集的大規(guī)模和高性能圖形分析提供了算法和構(gòu)建塊。
數(shù)據(jù)流水線型應(yīng)用(Data Pipeline Applications)
什么是數(shù)據(jù)流水線沐旨?
ETL是一種常見的在不同存儲(chǔ)系統(tǒng)之間轉(zhuǎn)換森逮、遷移數(shù)據(jù)的方法。通常來說磁携,他的工作就是周期性的觸發(fā)數(shù)據(jù)拷貝動(dòng)作褒侧,從一個(gè)關(guān)系型數(shù)據(jù)庫,到一個(gè)分析型數(shù)據(jù)庫谊迄,或者數(shù)據(jù)倉庫闷供。
數(shù)據(jù)流水線跟ETL的目的是一樣的,都是在不同存儲(chǔ)系統(tǒng)之間轉(zhuǎn)換鳞上、加工这吻、遷移數(shù)據(jù),然而他是以一種持續(xù)六的模式運(yùn)行篙议,而不是周期性的觸發(fā),因此怠硼,它可以從那些持續(xù)產(chǎn)生數(shù)據(jù)的源讀取并遷移數(shù)據(jù)鬼贱,同時(shí)在較低時(shí)延的情況下寫入另一個(gè)數(shù)據(jù)源。比如說香璃,一個(gè)數(shù)據(jù)流水線可以監(jiān)控某個(gè)文件系統(tǒng)目錄中新文件的生成这难,并且將寫入一個(gè)事件日志流內(nèi),另一個(gè)應(yīng)用就能基于此事件流實(shí)現(xiàn)一個(gè)增量型的文件搜索引擎葡秒。
下面的表格解釋了周期性ETL以及持續(xù)數(shù)據(jù)流水線應(yīng)用的區(qū)別:
數(shù)據(jù)流水線的好處是什么姻乓?
最明顯的一個(gè)好處就是低時(shí)延,其次眯牧,由于這種模式能夠持續(xù)的消費(fèi)并產(chǎn)生數(shù)據(jù)蹋岩,因此有更廣闊的應(yīng)用場(chǎng)景。
Flink 是如何支持?jǐn)?shù)據(jù)流水線的学少?
很多常見的數(shù)據(jù)轉(zhuǎn)換或者加工任務(wù)都可以通過Flink 的SQL接口來達(dá)成剪个,它也支持自定義處理函數(shù)。用戶還可以使用DataStream PI來實(shí)現(xiàn)更高級(jí)的數(shù)據(jù)流水線需求版确。Flink 提供了相當(dāng)豐富的存儲(chǔ)系統(tǒng)連接器扣囊,如:Kafka、Kinesis绒疗、Elasticsearch以及JDBC數(shù)據(jù)庫系統(tǒng)侵歇。他也為那些監(jiān)控文件目錄的系統(tǒng)以及以時(shí)間桶形式寫文件的系統(tǒng)提供持續(xù)的數(shù)據(jù)源支持。