當我們在談論Flink的時候,我們到底在談論些什麼

2022-05-05 19:03:10 字數 2404 閱讀 1085

目前每當我們聊到當下熱門的計算引擎的時候,無一例外地會聊到apache flink:當下非常火熱的流處理計算框架。更是有人拿它和spark做對比,到底哪個才是現今最好的計算引擎。當然這個已經不是本文所要闡述的主題啦。老實話,筆者本人做的比較多的還是儲存領域,對計算領域的知識不敢說是內行。最近也是抽空學習了下flink的一些概念體系,來分享分享筆者的乙個學習心得吧。

apache flink是乙個計算框架,更準確地來說,它是乙個處理有界/無界資料流的計算處理框架。類似於apache spark框架,它的計算處理過程也是在記憶體中做加速計算的。

在flink的流處理過程中,我們會經常提到有界,無界的資料流概念。那麼什麼叫做有界/無界的資料流呢?

無界資料流(bounded stream):乙個資料流,擁有開始而沒有結尾的定義,我們稱這種資料流為無界資料流。這種資料流一旦產生,就不會停止,而且需要被連續不斷地被處理。

有界資料流(unbounded stream):乙個「有頭有尾」的資料流。在有界資料流中,有序並不是乙個必須的要求。因為當我們接受到一批資料後,還是可以對其做排序的。作為乙個有頭有尾的資料流,我們可以把它理解為一段有固定大小的資料集合,那麼對於有界資料流的處理來說,它完全可以類似於我們平常所說的批處理。

在一段流資料中,有界和無界資料流的概念如下圖所示:

和spark類似,flink同樣利用記憶體來進行計算過程的加速,進一步地保證資料計算的低延時性。另外,為了保證flink錯誤恢復的一致性,flink將一些狀態資料進行了持久化外部儲存的操作(定期checkpoint操作),如下圖所示。

為了保證流計算任務的失敗恢復,flink內部對這塊做了很多的工作,包括可插拔的狀態後端儲存,exactly-once語義保證的checkpoint恢復,支援大規模量級的狀態儲存。

下面我們來深入flink框架內部,對內部的資料流模型做進一步地了解。

在資料處理的抽象層面,flink內部實現了4個層級的抽象,供使用者使用選擇,如下圖所示:

不同層級對應的使用方法的操作抽象程度各為不同,比如越低層級的操作方法,使用粒度可以做到做精細,但是使用起來不是很方面,學習成本相應也會較高。由比如說最高端別的sql級別,使用者使用起來就會很簡單,通過標準的sql標準語句,也能輕鬆構建出flink任務了。

在flink的普通任務過程中,一般 分為3個模組:

資料源頭,source源。

資料處理,processfunction,也可以理解為此為計算轉換過程。

資料結果輸出,sink端。

圖示結果如下:

在流處理的場景中,我們經常會碰到分段匯**計的需求,比如說分小時的pv/uv統計。flink提供了window視窗的概念來做這樣的處理。對於分時段的統計來說,我們可以用時間視窗來做這樣的資料處理,當然還有一種是基於記錄數的視窗。每當當前視窗過去,此視窗的計算結果值被記錄了下來,然後程式開始進行下乙個視窗結果的計算。通過flink內部設計的視窗來做這樣的運算後,就無須使用者來做時間分段的複雜邏輯控制了。至於視窗的具體實現原理,可以閱讀flink官網對此的介紹。flink的視窗處理效果如下所示,上面是基於時間的視窗劃分,下面是基於fixed-size的視窗,整體是自左向右的不間斷的流資料。

相比於傳統的資料分析應用來說,採用的方式往往式批處理的,週期性的執行分析任務。而對於flink來說,它的實時資料流的處理,能夠做到更低的延時和高的吞吐量,再加上它的checkpoint的容錯恢復機制。flink方式的任務具有很好的穩定性。

乙個典型的資料分析的使用場景,傳統方式和以flink的計算處理方式

又或者,我們可以利用flink框架低延時,高吞吐量的特點,來做一些etl(資料抽取轉換)任務。flink在新版本中已經能夠多型別source源的connect,這樣的話,我們完全也利用flink來做這樣的工作。下面是傳統方式etl和flink方式下的比較。

說了這麼多,筆者並不是鼓吹說flink都是萬能的,傳統批處理任務也有它自己的合適使用的地方。只是說,flink的出現,將會使得我們能夠更加靈活地進行技術的選型,來匹配實際的生產環境。

[1].

[2].

[3].

第1章 當我們談論演算法的時候,我們在談論什麼?

無論是bat,還是flag,但凡有點兒水平的技術公司,面試都要面演算法。為什麼演算法這麼重要?在工作中,真的會使用演算法嗎?學了演算法到底有什麼用?當我們談論演算法的時候,我們在談論什麼?大話資料結構 第 1 章緒論結尾語 既然無數的人都已經掌握了 資料結構與演算法 你憑什麼不行?只有真正掌握技術的...

當我們在談論HTTP隊頭阻塞時,我們在談論什麼?

通過tcp多路復用降低延遲 單個tcp連線上允許亂序request response,解決隊頭堵塞問題 實現層面上,大部分瀏覽器要求http 2必須開啟tls,一定程度上解決資料安全問題。其中,隊頭阻塞問題真的被解決了嗎?http 1.1為什麼會隊頭阻塞?http 1.1通過pipelining管道...

當我們在談進製的時候,我們在談什麼

關於進製,前幾天一朋友詢問二進位制和十六進製制的區別。遂在此總結一下關於進製的相關知識,回憶一下計算機的基礎內容,也幫朋友更好的理解一下。進製是一種記數方式,亦稱進製計數法或位值計數法。利用這種記數法,可以使用有限種數字符號來表示所有的數值。一種進製中可以使用的數字符號的數目稱為這種進製的基數或底數...