天天看點

阿裡、Uber都在用的Flink你了解多少?

實時流計算近幾年由于資料被廣泛重視,是通過實時推薦及計算來擷取目标資料而興起的技術。本文對分布式實時計算引擎Flink做了簡要介紹。本文選自《智能運維:從0搭建大規模分布式AIOps系統》一書。

流式計算處理的業務特點是資料的價值随着時間的流逝而降低,是以提高資料的處理速度及實時性是極其重要的。例如,使用者在浏覽微網誌時插入了Feed廣告,我們需要對所插入廣告的曝光、互動、負回報等資訊進行及時的回報,這時就需要流式計算。

Flink是一個針對流資料和批資料的分布式處理引擎,主要用Java代碼實作。對于Flink ,其處理的資料主要是流資料,批資料隻是流資料的一個極限特例而已。Flink的批處理方式采用的是流式計算原理,這一點跟Spark的設計思想正好相反(Spark Streaming本質上是批處理,隻是将計算分成了很小的單元,近似成流計算),這也是Flink的最大特點。目前使用Flink的公司有阿裡巴巴、Uber等。

基本概念

1.資料集

資料集(DataSet)分為有界資料集和無界資料集。無界資料集的資料會源源不斷地流入,有界資料集的資料是不可變的。許多傳統上被認為是有界或“批”資料的真實資料集實際上是無界資料集。無界資料集包括但不限于:與移動或Web應用程式互動的最終使用者、提供測量的實體傳感器、金融市場、機器的日志資料。

2.執行模型

實時處理是指當資料正在生成時連續執行的資料的處理過程。批處理是指在有限的時間内執行有限的資料的處理過程。不管采用哪種類型的執行模型來處理資料都是可以的,但卻不一定是最優的。例如,批處理一直被應用于無界資料集的處理上,盡管它存在視窗、狀态管理和次序錯誤等潛在問題。Flink采用實時處理的執行模型,在資料處理精度和計算性能方面都有更大的優勢。

3.Flink程式子產品

Flink程式包含的主要子產品有:Data Source、Transformations和Data Sink。

Flink程式包含的主要子產品

其中,Data Source(資料源)就是要進入Flink處理的資料,如HDFS、Kafka中的資料等。Transformations根據實際業務進行計算和轉換。Data Sink是Flink處理完的資料,即輸出資料。

Flink特點

Flink是一個開源的分布式實時計算架構。Flink是有狀态的和容錯的,可以在維護一次應用程式狀态的同時無縫地從故障中恢複;它支援大規模計算能力,能夠在數千個節點上并發運作;它具有很好的吞吐量和延遲特性。同時,Flink提供了多種靈活的視窗函數。

1.狀态管理機制

Flink檢查點機制能保持exactly-once語義的計算。狀态保持意味着應用能夠儲存已經處理的資料集結果和狀态。

Flink的狀态管理機制示意圖

2.事件機制

Flink支援流處理和視窗事件時間語義。事件時間可以很容易地通過事件到達的順序和事件可能的到達延遲流中計算出準确的結果。

Flink的事件機制示意圖

3.視窗機制

Flink支援基于時間、數目以及會話的非常靈活的視窗機制(window)。可以定制window的觸發條件來支援更加複雜的流模式。

Flink的視窗機制示意圖

4.容錯機制

Flink高效的容錯機制允許系統在高吞吐量的情況下支援exactly-once語義的計算。Flink可以準确、快速地做到從故障中以零資料丢失的效果進行恢複。

Flink的容錯機制示意圖

5.高吞吐量、低延遲

Flink具有高吞吐量和低延遲(能快速處理大量資料)特性。下圖展示了Apache Flink和Apache Storm完成分布式項目計數任務的性能對比。

Flink與Storm性能對比

6.部署

可以通過Yarn和Mesos等資源管理軟體來管理和部署Flink。

運作原理

1.鍊操作任務

分布式執行Flink的鍊操作任務,每個任務都由一個線程執行。将操作符連結到任務中是一個有用的優化,其減少了線程間切換和緩沖的開銷,并且在降低延遲的同時提高了總體吞吐量。可以配置連結行為,如下圖。

Flink的鍊操作示意圖

2.任務送出

Job Tracker:協調分布式執行—安排任務、協調檢查點、協調故障恢複等。為了具有高可用性,設定了多個JobManager,其中一個是上司者,其他的作為備用。

Task Tracker:執行任務(更具體地說,是一個資料流任務)、和緩沖區交換資料流。

Client:用戶端用來進行任務排程前期的準備(資料、環境變量等),然後送出計算任務到JobManager。任務送出之後,用戶端可以斷開連接配接,也可以繼續保持連接配接以接收進度報告。

3.運作

當Flink叢集啟動後,首先會啟動一個JobManager和一個或多個TaskManager。由用戶端送出任務給JobManager,JobManager再排程任務到各個TaskManager來執行,然後TaskManager将心跳和統計資訊彙報給JobManager。TaskManager之間以流的形式進行資料傳輸。

Flink整體流程圖(圖檔來源于Flink官網)

4.任務槽和資源

每個Worker(TaskManager)都是一個JVM程序,并且可以在單獨的線程中執行一個或多個子任務。為了控制Worker可以接收多少個任務,Worker有所謂的任務槽(至少一個)。

每個任務槽都代表TaskManager的一個固定資源子集。例如,具有三個插槽的TaskManager将為每個插槽配置設定1/3隔離的記憶體資源,這意味着子任務不會與其他作業中的子任務來競争記憶體。請注意,目前插槽僅分離托管的任務記憶體,不會進行CPU的隔離。。

通過調整任務槽的數量,使用者可以定義子任務如何彼此隔離。每個TaskManager都擁有一個插槽,這意味着每個任務組都可以在單獨的JVM中運作(例如,可以在單獨的容器中啟動);而擁有多個插槽,則意味着更多的子任務共享相同的JVM。同一個JVM中的任務共享TCP連接配接(通過多路複用)和心跳消息,它們也可能共享資料集和資料結構,進而減少每個任務的開銷。

Flink的任務槽示意圖

本文選自《智能運維:從0搭建大規模分布式AIOps系統》,彭冬,朱偉,劉俊等著,電子工業出版社2018年7月出版。

本書結合大企業的智能運維實踐,全面完整地介紹智能運維的技術體系,讓讀者更加了解運維技術的現狀和發展。同時,幫助運維工程師在一定程度上了解機器學習的常見算法模型,以及如何将它們應用到運維工作中。

了解本書詳情:

京東

當當 亞馬遜