為什么Flink會成為下一代大數(shù)據(jù)處理框架的標(biāo)準(zhǔn)?
01 什么是Flink?
在當(dāng)前數(shù)據(jù)量激增傳統(tǒng)的時代,不同的業(yè)務(wù)場景都有大量的業(yè)務(wù)數(shù)據(jù)產(chǎn)生,對于這些不斷產(chǎn)生的數(shù)據(jù)應(yīng)該如何進(jìn)行有效地處理,成為當(dāng)下大多數(shù)公司所面臨的問題。
隨著雅虎對Hadoop的開源,越來越多的大數(shù)據(jù)處理技術(shù)開始涌入人們的視線,例如目前比較流行大數(shù)據(jù)處理引擎Apache Spark,基本上已經(jīng)取代了MapReduce成為當(dāng)前大數(shù)據(jù)處理的標(biāo)準(zhǔn)。
但隨著數(shù)據(jù)的不斷增長,新技術(shù)的不斷發(fā)展,人們逐漸意識到對實(shí)時數(shù)據(jù)處理的重要性,企業(yè)需要能夠同時支持高吞吐、低延遲、高性能的流處理技術(shù)來處理日益增長的數(shù)據(jù)。
相對于傳統(tǒng)的數(shù)據(jù)處理模式,流式數(shù)據(jù)處理則有著更高的處理效率和成本控制。Apache Flink就是近年來在開源社區(qū)發(fā)展不斷發(fā)展的能夠支持同時支持高吞吐、低延遲、高性能分布式處理框架。
在2010至2014年間,由柏林工業(yè)大學(xué),柏林洪堡大學(xué)和哈索普拉特納研究所聯(lián)合發(fā)起名為“Stratosphere: Information Management on the Cloud”研究項(xiàng)目,該項(xiàng)目在當(dāng)時的社區(qū)逐漸具有一定社區(qū)知名度,2014年4月,Stratosphere代碼被貢獻(xiàn)給Apache 軟件基金會,成為Apache基金會孵化器項(xiàng)目。
期初參與該項(xiàng)目的核心成員均來自Stratosphere原來的核心成員,之后團(tuán)隊(duì)的大部分創(chuàng)始成員離開學(xué)校,共同創(chuàng)辦了一家名叫Data Artisans的公司,其主要業(yè)務(wù)便是將Stratosphere,也就是之后的Flink實(shí)現(xiàn)商業(yè)化。在項(xiàng)目孵化期間,項(xiàng)目Stratosphere改名為Flink。
Flink在德語中是快速和靈敏的意思,用來體現(xiàn)流式數(shù)據(jù)處理器的速度快和靈活性強(qiáng)等特點(diǎn),同時使用棕紅色松鼠圖案作為Flink項(xiàng)目的Logo,也是主要借助于松鼠靈活快速的特點(diǎn),由此Flink開始正式地進(jìn)入社區(qū)開發(fā)者的視線。
02 為什么Flink會成為下一代大數(shù)據(jù)處理框架的標(biāo)準(zhǔn)?
在2014年12月,該項(xiàng)目成為Apache 軟件基金會頂級項(xiàng)目,從2015年09月發(fā)布第一個穩(wěn)定版本0.9,到2019年4月已經(jīng)發(fā)布到1.8的版本,更多的社區(qū)開發(fā)成員也逐步地加入,現(xiàn)在Flink在全球范圍內(nèi)擁有350多位的開發(fā)人員,不斷有新的特性被發(fā)布。
同時在全球范圍內(nèi),越來越多的公司開始使用Flink,在國內(nèi)比較出名的互聯(lián)網(wǎng)公司如Alibaba,美團(tuán),滴滴等,都在大規(guī)模的使用Flink作為企業(yè)的分布式大數(shù)據(jù)處理引擎。
Flink在近年來逐步被人們所熟知和使用,其主要原因不僅因?yàn)樘峁┩瑫r支持高吞吐、低延遲和exactly-once語義的實(shí)時計(jì)算能力,同時Flink還提供了基于流式計(jì)算引擎處理批量數(shù)據(jù)的計(jì)算能力,真正意義實(shí)現(xiàn)了批流統(tǒng)一,同時隨著Alibaba對Blink的開源,極大地增強(qiáng)了Flink對批計(jì)算領(lǐng)域的支持。
眾多優(yōu)秀的特性,使得Flink成為開源大數(shù)據(jù)數(shù)據(jù)處理框架中的一顆新星,隨著國內(nèi)社區(qū)不斷推動,越來越多的國內(nèi)公司開始選擇使用Flink作為實(shí)時數(shù)據(jù)處理的技術(shù),在將來不久的時間內(nèi),F(xiàn)link也將會成為企業(yè)內(nèi)部主流的數(shù)據(jù)處理框架,最終成為下一代大數(shù)據(jù)數(shù)據(jù)處理框架的標(biāo)準(zhǔn)。
03 Flink的重要特性及優(yōu)勢
有狀態(tài)流計(jì)算將會隨著技術(shù)的發(fā)展,逐步成為企業(yè)作為構(gòu)建數(shù)據(jù)平臺的架構(gòu)模式,而這種技術(shù)實(shí)現(xiàn)的開源方案目前從社區(qū)來看,能夠滿足的就是Apache Flink。Flink通過實(shí)現(xiàn)Google Dataflow流式計(jì)算模型實(shí)現(xiàn)了高吞吐,低延遲,高性能兼具實(shí)時流式計(jì)算框架。
同時Flink支持高效容錯的狀態(tài)管理,F(xiàn)link能夠?qū)⑵錉顟B(tài)維護(hù)在內(nèi)存或RockDB數(shù)據(jù)庫中,為了防止?fàn)顟B(tài)在計(jì)算過程中因?yàn)橄到y(tǒng)異常而出現(xiàn)丟失,F(xiàn)link周期性的通過分布式快照技術(shù)CheckPoints實(shí)現(xiàn)狀態(tài)的持久化維護(hù),使得在系統(tǒng)即使在停機(jī)或者異常的情況下都能正確的進(jìn)行狀態(tài)恢復(fù),從而保證在任何時間都能計(jì)算出正確的結(jié)果。
數(shù)據(jù)架構(gòu)的演變過程,伴隨著技術(shù)的不斷迭代更新,F(xiàn)link具有先進(jìn)的架構(gòu)理念,以及諸多的優(yōu)秀特性,以及完善的編程接口,而Flink也在每一次的Release版本中,不斷推出新的特性。
例如Queryable State功能的提出,將直接容許用戶通過遠(yuǎn)程的方式直接獲取流式計(jì)算任務(wù)的狀態(tài)信息,也就是說數(shù)據(jù)不需要落地?cái)?shù)據(jù)庫就能直接從流式應(yīng)用中直接查詢出,對于實(shí)時交互式的查詢業(yè)務(wù)可以直接從Flink的狀態(tài)中查詢最新的結(jié)果,當(dāng)然這個功能目前還屬于Beta版本,但是相信在不久的未來,會變得越來越完善,那時Flink將不僅作為實(shí)時流式處理的框架,更多的可能會成為一套實(shí)時的存儲引擎,會讓更多的用戶從有狀態(tài)計(jì)算的技術(shù)中獲取收益。
同時支持高吞吐、低延遲、高性能
Flink是一套集高吞吐,低延遲,高性能三者于一身的分布式流式數(shù)據(jù)處理框架。
非常成熟的計(jì)算框架Apache Spark也只能兼顧高吞吐和高性能特性,在Spark Streaming流式計(jì)算中無法做到低延遲保障;而Apache Storm只能支持低延遲和高性能特性,但是無法滿足高吞吐的要求。而對于滿足高吞吐,低延遲,高性能這三個目標(biāo)對分布式流式計(jì)算框架是非常重要的。
支持事件時間(Event Time)概念
在流式計(jì)算領(lǐng)域中,窗口計(jì)算的地位舉足輕重,但目前大多數(shù)計(jì)算框架窗口計(jì)算所采用的都是系統(tǒng)時間(Process Time),也是事件傳輸?shù)接?jì)算框架處理時,系統(tǒng)主機(jī)的當(dāng)前時間,F(xiàn)link能夠支持基于事件時間(Event Time)語義的進(jìn)行窗口計(jì)算,就是使用事件產(chǎn)生的時間,這種時間機(jī)制使得事件即使無序到達(dá)甚至延遲到達(dá),數(shù)據(jù)流都能夠計(jì)算出精確的結(jié)果,同時保持了事件原本產(chǎn)生時的在時間維度的特點(diǎn),而不受網(wǎng)絡(luò)傳輸或者計(jì)算框架的影響。
支持有狀態(tài)計(jì)算
Flink在1.4版本中實(shí)現(xiàn)了狀態(tài)管理,所謂狀態(tài)就是在流式計(jì)算過程中將算子的中間結(jié)果數(shù)據(jù)的保存在內(nèi)存或者DB中,等下一個事件進(jìn)入接著從狀態(tài)中獲取中間結(jié)果進(jìn)行計(jì)算,從而無需基于全部的原始數(shù)據(jù)統(tǒng)計(jì)結(jié)果,這種做法極大地提升了系統(tǒng)的性能,同時也降低了計(jì)算過程的耗時。
對于數(shù)據(jù)量非常大且邏輯運(yùn)算非常復(fù)雜的流式運(yùn)算,基于狀態(tài)的流式計(jì)算則顯得非常使用。
支持高度靈活的窗口(Window)操作
在流處理應(yīng)用中,數(shù)據(jù)是連續(xù)不斷的,需要通過窗口的方式對流數(shù)據(jù)進(jìn)行一定范圍的聚合計(jì)算,例如統(tǒng)計(jì)在過去的1分鐘內(nèi)有多少用戶點(diǎn)擊了某一網(wǎng)頁,在這種情況下,我們必須定義一個窗口,用來收集最近一分鐘內(nèi)的數(shù)據(jù),并對這個窗口內(nèi)的數(shù)據(jù)再進(jìn)行計(jì)算。
Flink將窗口劃分為基于Time、Count、Session,以及Data-driven等類型的窗口操作,窗口能夠用靈活的觸發(fā)條件定制化從而達(dá)到對復(fù)雜的流傳輸模式的支持,不同的窗口操作應(yīng)用能夠反饋出真實(shí)事件產(chǎn)生的情況,用戶可以定義不同的窗口觸發(fā)機(jī)制來滿足不同的需求。
基于輕量級分布式快照(Snapshot)實(shí)現(xiàn)的容錯
Flink能夠分布式運(yùn)行在上千個節(jié)點(diǎn)之上,將一個大型計(jì)算的流程拆解成小的計(jì)算過程,然后將計(jì)算過程分布到單臺并行節(jié)點(diǎn)上進(jìn)行處理。
在任務(wù)執(zhí)行過程中,能夠自動的發(fā)現(xiàn)事件處理過程中的錯誤而導(dǎo)致數(shù)據(jù)不一致的問題,常見的錯誤類型例如:節(jié)點(diǎn)宕機(jī),或者網(wǎng)路傳輸問題,或是由于用戶因?yàn)樯壔蛐迯?fù)問題而導(dǎo)致計(jì)算服務(wù)重啟等。
在這些情況下,通過基于分布式快照技術(shù)的Checkpoints,將執(zhí)行過程中的任務(wù)信息進(jìn)行持久化存儲,一旦任務(wù)出現(xiàn)異常宕機(jī),F(xiàn)link能夠進(jìn)行任務(wù)的自動恢復(fù),從而確保數(shù)據(jù)在處理過程中的一致性。
基于JVM實(shí)現(xiàn)獨(dú)立的內(nèi)存管理
內(nèi)存管理是每套計(jì)算框架需要重點(diǎn)考慮的領(lǐng)域,尤其對于計(jì)算量比較大的計(jì)算場景,數(shù)據(jù)在內(nèi)存中該如何進(jìn)行管理,針對內(nèi)存管理這塊,F(xiàn)link實(shí)現(xiàn)了自身管理內(nèi)存的機(jī)制,盡可能減少Full GC對系統(tǒng)的影響。
另外通過自定義序列化/反序列化方法將所有的對象轉(zhuǎn)換成二進(jìn)制在內(nèi)存中存儲,降低數(shù)據(jù)存儲的大小,更加有效的對內(nèi)存空間進(jìn)行利用,降低GC所帶來的性能下降或者任務(wù)停止的風(fēng)險(xiǎn),同時提升了分布式處理過數(shù)據(jù)傳輸?shù)男阅堋?/p>
因此Flink較其他分布式處理的框架則會顯得更加穩(wěn)定,不會因?yàn)镴VM GC等問題而導(dǎo)致整個應(yīng)用宕機(jī)的問題。
Save Points(保存點(diǎn))
對于7*24小時運(yùn)行的流式應(yīng)用,數(shù)據(jù)源源不斷的接入,在一段時間內(nèi)應(yīng)用的終止都有可能導(dǎo)致數(shù)據(jù)的丟失或者計(jì)算結(jié)果的不準(zhǔn)確性,例如進(jìn)行版本的升級,停機(jī)運(yùn)維操作等,都能導(dǎo)致這種情況發(fā)生。
然而值得一提的是Flink通過其Save Points技術(shù)能夠?qū)⑷蝿?wù)執(zhí)行的快照(Snapshot)保存在存儲介質(zhì)上,等待任務(wù)重啟的時候可以直接從實(shí)現(xiàn)保存的Save Points恢復(fù)原有的計(jì)算狀態(tài),使得任務(wù)繼續(xù)按照停機(jī)之前的狀態(tài)繼續(xù)運(yùn)行,Save Points技術(shù)可以讓用戶更好的管理和運(yùn)維實(shí)時流式應(yīng)用。
同時Flink除了上述的特性之外也具有其他非常優(yōu)秀的特性,可以讓用戶有更多選擇。Flink具備非常多的優(yōu)秀特性,這不僅讓Flink在社區(qū)的知名度越來越高,也吸引了眾多的企業(yè)參與研發(fā)和使用Flink這項(xiàng)技術(shù)。
關(guān)于作者:張利兵,資深架構(gòu)師,流式計(jì)算領(lǐng)域?qū)<遥谒姆妒饺A東區(qū)AI項(xiàng)目架構(gòu)師,原明略數(shù)據(jù)華東區(qū)大數(shù)據(jù)架構(gòu)師。有多年大數(shù)據(jù)、流式計(jì)算方面的開發(fā)經(jīng)驗(yàn),對Hadoop、Spark、Flink等大數(shù)據(jù)計(jì)算引擎有著非常深入的理解,積累了豐富的項(xiàng)目實(shí)踐經(jīng)驗(yàn)。