隨著大數(shù)據(jù)時代的發(fā)展,海量數(shù)據(jù)和多種業(yè)務(wù)的實時處理需求激增,比如:實時監(jiān)控報警系統(tǒng)、實時風(fēng)控系統(tǒng)、實時推薦系統(tǒng)等,傳統(tǒng)的批處理方式和早期的流式處理框架因其自身的局限性,難以在延遲性、吞吐量、容錯能力以及使用便捷性等方面滿足業(yè)務(wù)日益苛刻的要求。
在過去的幾年里,從storm到后面spark的異軍突起,面向數(shù)據(jù)時代的實時計算技術(shù)出現(xiàn)了很多。Flink自2019年初開源以來,以其獨特的天然流式計算特性和更為先進的架構(gòu)設(shè)計,極大地改善了以前的流式處理框架所存在的問題,迅速成為大數(shù)據(jù)實時計算領(lǐng)域炙手可熱的技術(shù)框架,以及未來技術(shù)重要的發(fā)力點。
01 Flink簡介
【什么是Flink】
Flink 是一個框架和分布式處理引擎,用于在無邊界和有邊界數(shù)據(jù)流上進行有狀態(tài)的計算。Flink能在所有常見集群環(huán)境中運行,并能以內(nèi)存速度和任意規(guī)模進行計算。使用官網(wǎng)的語句來介紹, Flink 就是 “Stateful Computations over Data Streams”。對于這句話,我們該怎么理解呢。
首先,F(xiàn)link是一個純流式的計算引擎,它的基本數(shù)據(jù)模型是數(shù)據(jù)流。流可以是無邊界的無限流,即一般意義上的流處理。也可以是有邊界的有限流,也就是批處理。因此 Flink 用一套架構(gòu)同時支持了流處理和批處理。其次,F(xiàn)link支持有狀態(tài)的計算,稍微復(fù)雜一點的數(shù)據(jù)處理,比如說基本的聚合,數(shù)據(jù)流之間的關(guān)聯(lián)都是有狀態(tài)處理。
更直觀的講,對 Flink ??,其所要處理的主要場景就是流數(shù)據(jù),批數(shù)據(jù)只是流數(shù)據(jù)的?個極限特例?已,所以 Flink 是?款真正的流批統(tǒng)?的計算引擎。
【無界和有界數(shù)據(jù)】
**任何類型的數(shù)據(jù)都可以形成一種事件流。信用卡交易、傳感器測量、機器日志、網(wǎng)站或移動應(yīng)用程序上的用戶交互記錄,所有這些數(shù)據(jù)都形成一種流。數(shù)據(jù)可以被作為無界或者有界流來處理。 **
無界流 :有定義流的開始,但沒有定義流的結(jié)束。它們會無休止地產(chǎn)生數(shù)據(jù)。無界流的數(shù)據(jù)必須持續(xù)處理,即數(shù)據(jù)被攝取后需要立刻處理。我們不能等到所有數(shù)據(jù)都到達再處理,因為輸入是無限的,在任何時候輸入都不會完成。處理無界數(shù)據(jù)通常要求以特定順序攝取事件,例如事件發(fā)生的順序,以便能夠推斷結(jié)果的完整性。
有界流: 有定義流的開始,也有定義流的結(jié)束。有界流可以在攝取所有數(shù)據(jù)后再進行計算。有界流所有數(shù)據(jù)可以被排序,所以并不需要有序攝取。有界流處理通常被稱為批處理。
批處理:有界數(shù)據(jù)**
流處理:無界數(shù)據(jù)
Flink 擅長處理無界和有界數(shù)據(jù)集。精確的時間控制和狀態(tài)化使得 Flink能夠運行任何處理無界流的應(yīng)用。有界流則由一些特殊設(shè)計的算法和數(shù)據(jù)結(jié)構(gòu)進行內(nèi)部處理,也產(chǎn)生了出色的性能。
【有狀態(tài)計算】**
**有狀態(tài)的計算:每次進行數(shù)據(jù)計算的時候基于之前數(shù)據(jù)的計算結(jié)果(狀態(tài))做計算,并且每次計算結(jié)果都會保存到存儲介質(zhì)中,計算關(guān)聯(lián)上下文context 基于有狀態(tài)的計算不需要將歷史數(shù)據(jù)重新計算,提高了計算效率。
無狀態(tài)的計算:每次進行數(shù)據(jù)計算只是考慮當(dāng)前數(shù)據(jù),不會使用之前數(shù)據(jù)的計算結(jié)果。**
【Flink 基石】
目前比較一致的觀點是,F(xiàn)link之所以能備受歡迎,離不開它最重要的四個基石:Checkpoint、State、Time、Window。**
首先是Checkpoint機制,這是 Flink 最重要的一個特性。Flink實現(xiàn)了分布式一致性的快照,從而提供了 exactly-once 的語義。在 Flink 之前的流計算系統(tǒng)都沒有很好地解決這一問題。
每一個具有一定復(fù)雜度的流處理應(yīng)用都是有狀態(tài)的。提供了一致性的語義之后,F(xiàn)link 為了讓用戶在編程時能夠更輕松、更容易地去管理狀態(tài),引入了托管狀態(tài)(managed state)并提供了 API 接口,讓用戶使用起來感覺就像在用Java 的集合類一樣。
流處理的一個重要方面是應(yīng)用程序如何衡量時間,即區(qū)分事件時間和處理時間。Flink 實現(xiàn)了 watermark 的機制,解決了基于事件時間處理時的數(shù)據(jù)亂序和數(shù)據(jù)遲到的問題。
最后,流計算中的計算一般都會基于窗口來計算,所以 Flink 提供了一套開箱即用的窗口操作,包括滾動窗口、滑動窗口、會話窗口,還支持非常靈活的自定義窗口以滿足特殊業(yè)務(wù)的需求。
02 Flink核心架構(gòu)
Flink 采用分層的架構(gòu)設(shè)計,從而保證各層在功能和職責(zé)上的清晰。如圖所示,自上而下分別是 API & Libraries 層、Runtime 核心層以及物理部署層:
【API & Libraries 層】
這一層主要提供了編程API和頂層類庫:
編程 API : 用于進行流處理的 DataStream API 和用于進行批處理的 DataSet API。
頂層類庫:包括用于復(fù)雜事件處理的庫,用于結(jié)構(gòu)化數(shù)據(jù)查詢的 SQL & Table 庫,以及基于批處理的機器學(xué)習(xí)庫和圖形處理庫。
【Runtime 核心層】
這一層是 Flink 分布式計算框架的核心實現(xiàn)層,包括作業(yè)轉(zhuǎn)換,任務(wù)調(diào)度,資源分配,任務(wù)執(zhí)行等功能,基于這一層的實現(xiàn),可以在流式引擎下同時運行流處理程序和批處理程序。
【 物理部署層】
Flink的物理部署層,用于支持在不同平臺上部署應(yīng)用。Flink 不僅可以運行在包括 YARN、Kubernetes 在內(nèi)的多種資源管理框架上,還支持在裸機集群上獨立部署。在啟用高可用選項的情況下,它不存在單點失效問題。事實證明,F(xiàn)link 已經(jīng)可以擴展到數(shù)千核心,其狀態(tài)可以達到 TB 級別,且仍能保持高吞吐、低延遲的特性。
03 Flink分層API
在上面介紹的 API & Libraries 這一層,F(xiàn)link 又進行了更為具體的劃分。
按照如圖所示的層次結(jié)構(gòu),API 的一致性由下至上依次遞增,接口的表現(xiàn)能力由下至上依次遞減,各層的核心功能如下:
【SQL & Table API】
Flink 提供的最高層級的抽象是 SQL 。
Flink 支持兩種關(guān)系型的 API,Table API 和 SQL。這兩個 API 都是批處理和流處理統(tǒng)一的 API,意味著在無邊界的實時數(shù)據(jù)流和有邊界的歷史記錄數(shù)據(jù)流上,關(guān)系型 API 會以相同的語義執(zhí)行查詢,并產(chǎn)生相同的結(jié)果。支持用戶自定義的標(biāo)量函數(shù),聚合函數(shù)以及表值函數(shù),可以滿足多樣化的查詢需求。
【DataStream API】
DataStream & DataSet API 是 Flink 數(shù)據(jù)處理的核心 API,支持使用Java或Scala語言進行調(diào)用,提供了數(shù)據(jù)讀取,數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)輸出等一系列常用操作的封裝。
DataStream API 為許多通用的流處理操作提供了處理原語。這些操作包括窗口、逐條記錄的轉(zhuǎn)換操作,在處理事件時進行外部數(shù)據(jù)庫查詢等,并預(yù)先定義了例如map()、reduce()、aggregate()等函數(shù)。你可以通過擴展實現(xiàn)預(yù)定義接口或使用lambda 表達式實現(xiàn)自定義的函數(shù)。
【ProcessFunction】
ProcessFunction 是 Flink 所提供的最具表達力的接口,可以處理一或兩條輸入數(shù)據(jù)流中的單個事件,或者歸入一個特定窗口內(nèi)的多個事件。它提供了對于時間和狀態(tài)的細粒度控制。開發(fā)者可以在其中任意地修改狀態(tài), 實現(xiàn)許多有狀態(tài)的事件驅(qū)動應(yīng)用所需要的、基于單個事件的復(fù)雜業(yè)務(wù)邏輯。
04 Flink核心組件
Flink 核心架構(gòu)的第二層是 Runtime 層,該層包含了兩個重要角色,分別是JobManager和TaskManager,是一個典型的Master-Slave架構(gòu)。JobManager相當(dāng)于是Master,TaskManager相當(dāng)于是Slave。它們的功能分別如下:
(一)JobManager(JVM進程)
負責(zé)整個集群的資源管理與任務(wù)調(diào)度,在一個集群中只能有一個正在工作(active)的 JobManager,如果HA集群,那么其他JobManager是standby狀態(tài)。
(1)資源管理。集群啟動,TaskManager會將當(dāng)前節(jié)點的資源信息注冊給JobManager,所有TaskManager全部注冊完畢,集群啟動成功,此時JobManager會根據(jù)集群中的資源情況,為當(dāng)前的Application分配TaskSlot資源。
(2)任務(wù)調(diào)度。分發(fā)task到TaskSlot中運行,Job執(zhí)行過程中,JobManager會根據(jù)設(shè)置的策略觸發(fā)checkpoint,任務(wù)執(zhí)行完畢,JobManager會將Job執(zhí)行的信息反饋給client,并且釋放資源。
(二)TaskManager(JVM進程)
(1)負責(zé)當(dāng)前節(jié)點上的任務(wù)運行及資源管理,TaskManager資源通過TaskSlot進行了劃分,每個TaskSlot代表的是一份固定資源。例如,具有三個slots 的TaskManager會將其管理的內(nèi)存資源分成三等份給每個 slot。
(2)負責(zé)TaskManager之間的數(shù)據(jù)交換。
05 Flink應(yīng)用場景
世界各地有很多要求嚴(yán)苛的流處理應(yīng)用都運行在 Flink 之上。接下來我們介紹常見的幾類應(yīng)用,分別是:事件驅(qū)動型應(yīng)用,數(shù)據(jù)分析應(yīng)用以及數(shù)據(jù)管道應(yīng)用。
【事件驅(qū)動型應(yīng)用】
事件驅(qū)動型應(yīng)用是一類具有狀態(tài)的應(yīng)用,它從一個或多個事件流提取數(shù)據(jù),并根據(jù)到來的事件觸發(fā)計算、狀態(tài)更新或其它外部動作。
在傳統(tǒng)架構(gòu)中,應(yīng)用需要讀寫遠程事務(wù)型數(shù)據(jù)庫。相反,事件驅(qū)動型應(yīng)用是在計算存儲分離的傳統(tǒng)應(yīng)用基礎(chǔ)上進化而來,是基于狀態(tài)化流處理來完成。在該設(shè)計中,數(shù)據(jù)和計算不會分離,應(yīng)用只需訪問本地(內(nèi)存或磁盤)即可獲取數(shù)據(jù)。系統(tǒng)容錯性的實現(xiàn)依賴于定期向遠程持久化存儲寫入checkpoint。下圖描述了傳統(tǒng)應(yīng)用和事件驅(qū)動型應(yīng)用架構(gòu)的區(qū)別。
事件驅(qū)動型應(yīng)用無須查詢遠程數(shù)據(jù)庫,本地數(shù)據(jù)訪問使得它具有更高的吞吐和更低的延遲。典型的應(yīng)用實例:反欺詐,異常檢測,基于規(guī)則的報警以及業(yè)務(wù)流程監(jiān)控等。
【數(shù)據(jù)分析應(yīng)用】
數(shù)據(jù)分析任務(wù)需要從原始數(shù)據(jù)中提取有價值的信息和指標(biāo)。傳統(tǒng)的分析方式通常是利用批查詢,或?qū)⑹录涗浵聛聿⒒诖藰?gòu)建應(yīng)用來完成。為了得到最新數(shù)據(jù)的分析結(jié)果,必須先將它們加入分析數(shù)據(jù)集并重新執(zhí)行查詢或運行應(yīng)用,隨后將結(jié)果寫入存儲系統(tǒng)。
借助一些先進的流處理引擎,還可以實時地進行數(shù)據(jù)分析。和傳統(tǒng)模式下讀取有限數(shù)據(jù)集不同,流式查詢會接入實時事件流,并隨著事件消費持續(xù)產(chǎn)生和更新結(jié)果。這些結(jié)果數(shù)據(jù)可能會寫入外部數(shù)據(jù)庫系統(tǒng)或以內(nèi)部狀態(tài)的形式維護。
如圖所示,F(xiàn)link為持續(xù)流式分析和批量分析都提供了良好的支持。具體而言,它內(nèi)置的 SQL 接口,將批、流查詢的語義統(tǒng)一起來。無論是在記錄事件的靜態(tài)數(shù)據(jù)集上還是實時事件流上,相同 SQL 查詢都會得到一致的結(jié)果。典型的應(yīng)用實例:電信網(wǎng)絡(luò)質(zhì)量監(jiān)控,移動應(yīng)用中的產(chǎn)品更新及實驗評估分析,消費者技術(shù)中的實時數(shù)據(jù)即席分析以及大規(guī)模圖分析等。
【數(shù)據(jù)管道應(yīng)用】
提取-轉(zhuǎn)換-加載(ETL)是一種在存儲系統(tǒng)之間進行數(shù)據(jù)轉(zhuǎn)換和遷移的常用方法。ETL 作業(yè)通常會周期性地觸發(fā),將數(shù)據(jù)從事務(wù)型數(shù)據(jù)庫拷貝到分析型數(shù)據(jù)庫或數(shù)據(jù)倉庫。
數(shù)據(jù)管道和 ETL 作業(yè)的用途相似,都可以轉(zhuǎn)換、豐富數(shù)據(jù),并將其從某個存儲系統(tǒng)移動到另一個。但數(shù)據(jù)管道是以持續(xù)流模式運行,而非周期性觸發(fā)。因此它支持從一個不斷生成數(shù)據(jù)的源頭讀取記錄,并將它們以低延遲移動到終點。例如:數(shù)據(jù)管道可以用來監(jiān)控文件系統(tǒng)目錄中的新文件,并將其數(shù)據(jù)寫入事件日志;另一個應(yīng)用可能會將事件流物化到數(shù)據(jù)庫或增量構(gòu)建和優(yōu)化查詢索引。
和周期性 ETL 作業(yè)相比,持續(xù)數(shù)據(jù)管道可以明顯降低將數(shù)據(jù)移動到目的端的延遲。此外,由于它能夠持續(xù)消費和發(fā)送數(shù)據(jù),因此用途更廣,支持用例更多。很多常見的數(shù)據(jù)轉(zhuǎn)換和增強操作可以利用 Flink 的接口及用戶自定義函數(shù)解決。典型的應(yīng)用實例:電子商務(wù)中的實時查詢索引構(gòu)建以及電子商務(wù)中的持續(xù)ETL等。
06 Flink優(yōu)點及挑戰(zhàn)
【Flink 的優(yōu)點】
基于上面的介紹,總結(jié)一下 Flink 的優(yōu)點:
1)Flink 是基于事件驅(qū)動 (Event-driven) 的應(yīng)用,能夠同時支持流處理和批處理,結(jié)合Watermark處理亂序數(shù)據(jù);
2)同時支持高吞吐、低延遲、高性能;
3)基于內(nèi)存的計算,能夠保證高吞吐和低延遲,具有優(yōu)越的性能表現(xiàn);
4)支持精確一次 (Exactly-once) 語意,能夠完美地保證一致性和正確性;
5)支持有狀態(tài)計算,并且可以將狀態(tài)存在內(nèi)存或者 RocksDB;
6)分層 API ,能夠滿足各個層次的開發(fā)需求;
7)支持高可用配置,支持保存點機制,能夠提供安全性和穩(wěn)定性上的保證;
8)多樣化的部署方式,支持本地,遠端,云端等多種部署方案;
9)具有橫向擴展架構(gòu),能夠按照用戶的需求進行動態(tài)擴容;
10)活躍度極高的社區(qū)和完善的生態(tài)圈的支持。
**【Flink面臨的挑戰(zhàn)】
**Flink目前流計算的模型已經(jīng)相對比較成熟和領(lǐng)先,也經(jīng)歷了各個公司大規(guī)模生產(chǎn)的驗證,屬于大數(shù)據(jù)生態(tài)里的計算環(huán)節(jié),只做計算,不做存儲。但是在實際工作當(dāng)中,你會發(fā)現(xiàn)往往單獨用Flink是不夠的。比如你的數(shù)據(jù)是從哪里讀出來,計算完之后數(shù)據(jù)又將存到哪里,又怎么消費這些數(shù)據(jù),如何利用Flink來完成某個垂直領(lǐng)域的特殊任務(wù)等等。
**與此同時,如果要用Flink要做其他一些場景(比如機器學(xué)習(xí),交互式分析)就會比較復(fù)雜,用戶體驗上還有很大的提升空間。這些涉及到上下游,需要一個強大的生態(tài)圈來完成。這也正是Flink生態(tài)所面臨的挑戰(zhàn)。
-
傳感器
+關(guān)注
關(guān)注
2553文章
51415瀏覽量
756680 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7148瀏覽量
89597 -
分布式
+關(guān)注
關(guān)注
1文章
924瀏覽量
74613 -
大數(shù)據(jù)
+關(guān)注
關(guān)注
64文章
8909瀏覽量
137805
發(fā)布評論請先 登錄
相關(guān)推薦
評論