得益于其強(qiáng)大的可擴(kuò)展性,Apache Flink 在開(kāi)發(fā)并運(yùn)行各種不同類(lèi)型的應(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 也無(wú)可挑剔。事實(shí)證明,F(xiàn)link 可以擴(kuò)展到成千上萬(wàn)個(gè)內(nèi)核,處理TB量級(jí)的應(yīng)用狀態(tài),高吞吐,低時(shí)延,同時(shí)能夠hold得住世上大部分流處理應(yīng)用。
接下來(lái),我們會(huì)探索基于Flink 實(shí)現(xiàn)的最常見(jià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è)事件流源接受事件,并且通過(guò)進(jìn)行相應(yīng)的計(jì)算、狀態(tài)變更以及其他操作來(lái)對(duì)這些事件做出響應(yīng)。
相比傳統(tǒng)的應(yīng)用設(shè)計(jì),事件驅(qū)動(dòng)型應(yīng)用無(wú)疑是一個(gè)革命。在傳統(tǒng)場(chǎng)景中,計(jì)算和存儲(chǔ)是分開(kāi)的,應(yīng)用程序從遠(yuǎn)程事務(wù)數(shù)據(jù)庫(kù)讀取數(shù)據(jù)并將數(shù)據(jù)持久化到該數(shù)據(jù)庫(kù)。而事件驅(qū)動(dòng)型應(yīng)用恰恰相反,它基于一些有狀態(tài)的流處理應(yīng)用,數(shù)據(jù)和計(jì)算資源位于一處,從而可以實(shí)現(xiàn)本地?cái)?shù)據(jù)訪問(wèn)(從內(nèi)存或本地磁盤(pán))。在處理期間,會(huì)周期性的拉取本地狀態(tài)并同步寫(xiě)入遠(yuǎn)端一個(gè)位置來(lái)實(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ù)庫(kù),再讀取進(jìn)行處理,事件驅(qū)動(dòng)型應(yīng)用直接本地訪問(wèn)事件,并直接處理,從而帶來(lái)更好的表現(xiàn)。
容錯(cuò)性設(shè)計(jì):周期性檢查本地任務(wù)狀態(tài)并異步、增量地更新到遠(yuǎn)端持久層。因此,檢查點(diǎn)對(duì)常規(guī)事件處理的影響非常小。
事件驅(qū)動(dòng)型應(yīng)用的好處不僅是提供本地?cái)?shù)據(jù)訪問(wèn)這一點(diǎn),在傳統(tǒng)架構(gòu)中,多個(gè)應(yīng)用往往共享一個(gè)數(shù)據(jù)庫(kù)實(shí)例,因此每當(dāng)有數(shù)據(jù)結(jié)構(gòu)變更時(shí),其他服務(wù)往往都需要做一定的配合,或者實(shí)例擴(kuò)容情況出現(xiàn)時(shí),其他服務(wù)訪問(wèn)數(shù)據(jù)庫(kù)也會(huì)受到一定的性能影響。然而,本地化的數(shù)據(jù)訪問(wèn)模式,使得事件驅(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)的能力來(lái)定義。Flink的許多突出特征都集中在這些概念上。Flink提供了一組豐富的狀態(tài)原語(yǔ),可以管理非常大的數(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)的庫(kù),用于檢測(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ù)集來(lái)做批量查詢。如果想要得到最新數(shù)據(jù)的結(jié)果,需要不斷地把新數(shù)據(jù)增量加進(jìn)去再做分析工作。結(jié)果會(huì)寫(xiě)到存儲(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é)果要么寫(xiě)到一個(gè)外部數(shù)據(jù)庫(kù),要么以內(nèi)部狀態(tài)被維護(hù)起來(lái)。報(bào)表應(yīng)用可以直接從外部數(shù)據(jù)庫(kù)或者從本地應(yīng)用讀取最新的數(shù)據(jù)。Apache Flink 同時(shí)支持批處理分析以及流處理分析:

流分析應(yīng)用的好處是什么?
批處理架構(gòu)往往由幾個(gè)獨(dú)立的組件組成:
- 周期性拉取數(shù)據(jù)
- 執(zhí)行查詢操作
這些操作帶來(lái)了時(shí)間開(kāi)銷(xiāo),一旦某個(gè)環(huán)節(jié)出錯(cuò)就會(huì)影響整體。而基于復(fù)雜流處理引擎(如:Flink )的應(yīng)用把所有步驟合并到一起:數(shù)據(jù)抓取、持續(xù)結(jié)果計(jì)算,因此避開(kāi)了各出錯(cuò)環(huán)節(jié),同時(shí)可以依賴引擎的錯(cuò)誤恢復(fù)機(jī)制。
Flink 是如何支持?jǐn)?shù)據(jù)分析應(yīng)用型應(yīng)用的?
Flink 對(duì)持續(xù)的流處理以及批處理都支持得很好。具體來(lái)說(shuō),它具有一個(gè)符合ANSI標(biāo)準(zhǔn)的SQL接口,該接口具有用于批處理和流式查詢的統(tǒng)一語(yǔ)義。不管是查詢靜態(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庫(kù)為批量數(shù)據(jù)集的大規(guī)模和高性能圖形分析提供了算法和構(gòu)建塊。
數(shù)據(jù)流水線型應(yīng)用(Data Pipeline Applications)
什么是數(shù)據(jù)流水線?
ETL是一種常見(jiàn)的在不同存儲(chǔ)系統(tǒng)之間轉(zhuǎn)換、遷移數(shù)據(jù)的方法。通常來(lái)說(shuō),他的工作就是周期性的觸發(fā)數(shù)據(jù)拷貝動(dòng)作,從一個(gè)關(guān)系型數(shù)據(jù)庫(kù),到一個(gè)分析型數(shù)據(jù)庫(kù),或者數(shù)據(jù)倉(cāng)庫(kù)。
數(shù)據(jù)流水線跟ETL的目的是一樣的,都是在不同存儲(chǔ)系統(tǒng)之間轉(zhuǎn)換、加工、遷移數(shù)據(jù),然而他是以一種持續(xù)六的模式運(yùn)行,而不是周期性的觸發(fā),因此,它可以從那些持續(xù)產(chǎn)生數(shù)據(jù)的源讀取并遷移數(shù)據(jù),同時(shí)在較低時(shí)延的情況下寫(xiě)入另一個(gè)數(shù)據(jù)源。比如說(shuō),一個(gè)數(shù)據(jù)流水線可以監(jiān)控某個(gè)文件系統(tǒng)目錄中新文件的生成,并且將寫(xiě)入一個(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ù)流水線的?
很多常見(jiàn)的數(shù)據(jù)轉(zhuǎn)換或者加工任務(wù)都可以通過(guò)Flink 的SQL接口來(lái)達(dá)成,它也支持自定義處理函數(shù)。用戶還可以使用DataStream PI來(lái)實(shí)現(xiàn)更高級(jí)的數(shù)據(jù)流水線需求。Flink 提供了相當(dāng)豐富的存儲(chǔ)系統(tǒng)連接器,如:Kafka、Kinesis、Elasticsearch以及JDBC數(shù)據(jù)庫(kù)系統(tǒng)。他也為那些監(jiān)控文件目錄的系統(tǒng)以及以時(shí)間桶形式寫(xiě)文件的系統(tǒng)提供持續(xù)的數(shù)據(jù)源支持。