隨著大資料技術在各行各業的廣泛應用,要求能對海量資料進行實時處理的需求越來越多,同時資料處理的業務邏輯也越來越複雜,傳統的批處理方式和早期的流式處理框架也越來越難以在延遲性、吞吐量、容錯能力以及使用便捷性等方面滿足業務日益苛刻的要求。
我們主要從以下幾個部分來看:
一.流式處理的背景:
1.流式處理的背景—必要性
比如說,在入侵檢測的場景下,我們希望看到的結果是:一旦有入侵,我們能及時地作出響應。這種情況下,如果按照傳統的批處理方式,是不可能在入侵的時候實時檢測出結果的。另外,比如說在語音計算中,我們要實時監控各個虛擬器的執行狀態以及出現錯誤時的預警,這種情況下,也要求我們能夠實時監控資料,並對資料產生的各種報警,實時採取動作。由此,流式處理的必要性就顯得無疑了。
2.流式處理的背景—基礎架構
我們來看一下流式處理的基本框架。
主要分為六個部分:事件生產者、收集、排隊系統(其中kafka的主要目的是,在資料高峰時,暫時把它快取,防止資料丟失。)、資料變換(也就是流式處理過程)、長期儲存、陳述/行動。
3.流式處理的背景—評測指標
目前的業界有很多流式處理的框架,在這麼多框架中,我們怎樣評價這個流式處理框架的效能呢?有哪些指標呢?一般我們會從以下這些方面來考核流式處理框架的能力。
其中「資料傳輸的保障度」,是指能不能保證資料被處理並到達目的地。它有三種可能性:保證至少一次、最多一次、精確一次。大多數情況下,「保證至少一次」就能滿足業務要求,除要求資料精確度高的特定場景。
「處理延遲」,在大多數情況下,流式處理的延遲越低越好,但很多情況下,我們的延遲越低,相應付出的代價也越高,「吞吐量」與「處理延遲」就是一對矛盾。吞吐量高,相應的延遲就會低,吞吐量低,相應的延遲就會高。
「狀態管理」,我們在實時變換的過程中,要有與外部的互動,如入侵檢測,以此來保護環境和資料的安全。
「容錯能力」和「容錯負荷」要求當流式處理在正常進行中,即使有某些機器掛掉,系統仍能正常執行,整個流式處理框架不受影響。
「流控」,也就是流量控制,我們在資料傳輸的過程中,可能會資料突然增多,為了保證系統不至於負荷過重而崩潰,這時候就需要控制資料密度。
「程式設計複雜性」,相對而言,api設計地越高階,程式設計負擔越低。
4.流式處理的背景—選型
了解流式處理框架的考核標準之後,那麼我們為什麼選擇flink?flink有哪些優勢呢?
「保證帶狀態計算下的精確一次語義」,對於某些特定的計算而言非常有必要。
一般在流式處理框架中,資料的處理一般有兩種方式,一種是按照處理時間來處理資料,另一種就是按照事件時間來處理資料,「事件時間語義支援」方式更為複雜。
flink的api非常高階,在處理流式資料的邏輯業務中,效率更高。
二.flink的原理:
了解flink的背景之後,我們一起來看一看它的原理。
1.概述
flink的整個元件類似於spark,它的核心是乙個分布式的流式處理框架,在核心之上,有兩套api,一套應用於批處理—dataset api,一套應用於流式處理—datastream api。
從圖中我們可以看到,在兩套api下又有更為高階的庫,而它的整個處理部署方式可以支援本地、集群、雲端。
2.基礎架構
flink的整個架構和spark很相似,有三個主要部分。
乙個是提交任務的客戶端—flink program;還有作業的管理器—jobmanager,主要負責任務的排程和狀態的檢測,以及在整個集群出現故障時進行初步管理;最後是任務管理器—taskmanager,實現業務邏輯的執行,負責把接受到的任務執行之後,將相應的結果輸出到外部或進行外部互動。
在整個過程中,jobmanager是不負責任務執行的。
3.程式設計模型
下面我們來看一下flink的具體程式設計模型結構。
第一條語句是建立整個flink執行時的環境,類似於spark裡建立乙個上下文。它的主要業務邏輯是由指定資料來源、指定變換邏輯、指定輸出三部分決定的。
指定資料來源的過程就是nv.addsource,這是指定我們的資料到底從**來,在這個設計中,它是從kafka裡把資料讀出來。在這個事例裡面,資料流的變換比較簡單,只是把每一行資料做乙個解析,解析完後獲得另乙個資料流,就構成了 datastreamevents這個資料流。
這大致就是整個資料流的業務邏輯,箭頭下方是資料流圖。
示例裡面展示的只是部分api,除了上面那些,還有很多操作,我們一起來看下面這張。
「map」就是做一些對映,比如我們把兩個字串合併成乙個字串,把乙個字串拆成兩個或者三個字串。
「flatmap」類似於把乙個記錄拆分成兩條、三條、甚至是四條記錄。
「filter」就類似於過濾。
「keyby」就等效於sql裡的group by。
「reduce」就類似於mapreduce裡的reduce。
「join」操作就有點類似於我們資料庫裡面的join。
「aggregate」是乙個聚合操作,如計數、求和、求平均等。
「connect」實現把兩個流連成乙個流。
「project」操作就類似於sql裡面的snacks。
「repartition」是乙個重新分割槽操作。
4.執行機制
知道flink的程式設計模型之後,那麼flink是怎樣去執行這些業務邏輯的呢?下面是它的執行機制。
上圖是表現業務邏輯的業務執行圖,flink的執行方式類似於管道,它借鑑了資料庫的一些執行原理,實現了自己獨特的執行方式。
5.狀態與容錯
flink的容錯機制很特別,我們一起來看一看。
flink在處理資料流時,它的整個資料流裡面的資料分為兩種,一種是本身業務發給的資料,還有一種是flink自己插到資料流裡面的資料。插入的記錄我們叫它barrier,就是柵欄,我們可以把它看成乙個表示進度的標記,標記整個資料處理的狀態,它從源頭發出。從圖中我們可以看到,不管是什麼流,它都會產生乙個checkpoint barrier。
當operator收到柵欄之後,它會把柵欄的狀態儲存,然後把特定記錄發出去,到達第二個operator裡面,它又把它的狀態放到master裡,它就是這樣一步一步去完成的。在這個過程中,如果有一步出現故障,flink會重複前面的步驟,重新去執行,所以不會出現資料的丟失和錯誤。
三.flink的實踐:
1.示例
我們來看一下具體的示例。
第一步是初始化框架的執行時環境;第二步是指定資料流的資料來源,示例裡指定的是flinkkafkaconsumer010<>(...)資料;第三步是實現資料流的業務變換邏輯,這裡主要是通過flatmap把乙個記錄分成多條記錄,通過filter進行過濾,之後按照網域名稱進行分組,指定視窗長度,最後指定統計方式,這裡的統計方式是計數;第四步就是對統計出來的資料流進行指定輸出;最後一步,提交資料變換邏輯到框架中經編譯後執行。
2.監控
把這個程式啟動之後,我們就可以看到flink的監控頁面,下面是一些監控資訊。
我們可以看到,在啟動的flink集群裡面,有80個task managers,80個巢,1個空閒的巢數,紅框點進去之後,就是下面的。
監控指標有很多。
四.總結與展望:
最後,我們來做一下總結。以上只是關於flink的一些簡單介紹,關於flink的記憶體管理、部署、內部執行機制等相關詳細資料,我們可以通過以下**進行資料查詢。
apache flink是有關flink開源的官方**。
dataartisans是flink背後的乙個商業公司,flink由它發展起來。它上面的部落格包含好多關於flinkd的介紹,以及一些有深度的文章。
athenax主要是關於flink的前瞻性研究的**。
1.請老師講講flink和最新版spark的對比?
曠老師:spark streaming和flink是競爭關係,兩個框架都是流處理裡面用的比較多,flink最大的優勢在於保證高吞吐量情況下的低延遲,以及對複雜的帶有狀態的流的狀態管理能力,還有就是非常靈活視窗的支援。
2.新版spark採用的是timeline db技術嗎?
曠老師:不是的,timeline db在實現上與spark不是一樣的,spark streaming是典型的微批次的流處理框架,其他的大部分都是基於pipeline的執行架構。
flink 2 概念 有狀態的流式處理
傳統批處理方法是持續收取資料,以時間作為劃分多個批次的依據,再周期性地執行批次運算。但假設需要計算每小時出現事件轉換的次數,如果事件轉換跨越了所定義的時間劃分,跨越了批次的時間邊界,傳統批處理會將中介運算結果帶到下乙個批次進行計算 除此之外,當出現接收到的事件順序顛倒情況下,傳統批處理仍會將中介狀態...
Flink原理與實現 詳解Flink中的狀態管理
上面flink原理與實現的文章中,有引用word count的例子,但是都沒有包含狀態管理。也就是說,如果乙個task在處理過程中掛掉了,那麼它在記憶體中的狀態都會丟失,所有的資料都需要重新計算。從容錯和訊息處理的語義上 at least once,exactly once flink引入了stat...
Flink原理與實現 理解Flink中的計算資源
本文所討論的計算資源是指用來執行 task 的資源,是乙個邏輯概念。本文會介紹 flink 計算資源相關的一些核心概念,如 slot slotsharinggroup colocationgroup chain等。並會著重討論 flink 如何對計算資源進行管理和隔離,如何將計算資源利用率最大化等等...