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