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