Apache Flink介紹 俗話說知子莫若父,要想瞭解一門技術就要看官方的介紹。Flink官網對Flink的介紹是這樣的: Apache Flink is a framework and distributed processing engine for stateful computations ...
Apache Flink介紹
俗話說知子莫若父,要想瞭解一門技術就要看官方的介紹。Flink官網對Flink的介紹是這樣的:
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
額...看不懂。翻譯過來就是:
apache flink是一個用於在無界和有界數據流上進行有狀態計算的分散式處理框架和引擎。Flink被設計成可以在所有常見的集群環境中運行,以記憶體速度和任何規模執行計算。
似乎太籠統了。接下來我們就深入的瞭解一下Flink究竟是一個什麼鬼。
數據架構的演變
要想瞭解Flink我們還得從分散式計算的歷史講起,所以歷史課時間到。
在國外一些社區,有很多人講計算引擎分為了四代,雖然這並不能代表所有人的觀點,但是我們可以在這些分代中看出計算引擎的區別。
首先第一代的計算引擎,無疑就是Hadoop承載的MapReduce了。相信瞭解大數據的童鞋對MapReduce都不會陌生,它將計算分成兩部分,一部分是Map階段,一部分是Reduce階段。這對於上層應用來說就不得不拆分演算法。如果是較為複雜的計算,甚至於不得不實現多個Job的串聯,例如迭代計算。
由於第一代計算引擎的弊端,催生了支持DAG ( Directed Acyclic Graph)框架的誕生。支持DAG框架的計算引擎被劃分為了第二代計算引擎,比如Tez或Oozie。第二代計算引擎執行的大多數是批量任務。
前兩代的計算引擎都是延遲較為嚴重,沒法滿足實時性要求比較高的需求。而以Spark為代表的第三代計算引擎很好的解決了這一問題。第三代計算引擎的特點主要是 Job 內部的 DAG 支持(不跨越Job),以及強調的實時計算。這裡強調一點,這裡的實時計算實質上是微批處理,並不是真正意義上的實時處理。
接下來的第四代計算引擎實現了真正意義上的實時處理,這就是我們今天介紹的Flink。當然Flink除了能夠實現數據的實時處理外也很好的支持了批處理和DAG的運算。
迭代計算性能對比測試:Flink > Spark > Hadoop(MR)。迭代次數越多越明顯,性能上Flink優於Spark和Hadoop最主要的原因是Flink支持增量迭代,具有對迭代自動優化的功能。
兩種數據集和兩種處理方式
有界數據與無界數據
Flink最大的特色就是它的流式處理方式。而在介紹Flink的流式處理我們要先瞭解一下有界數據和無界數據,好,上圖:
有界數據流(bounded stream):具有定義的開始點和結束點。
無界數據流(unbounded stream):有一個起點,但沒有定義的終點。
無界數據集包括但不限於如下
- 終端用戶與APP或WEB交互的數據
- 物理感測器採集的數據
- 金融市場行情
- 系統或機器日誌
就現實來說,在Flink出現之前由於處理方式的局限性,我們通常會將一些無界數據流人為的切分成有界數據流,然後在基於有界數據流進行處理。
流處理與批處理
流處理(Streaming):只要有數據生成則馬上執行計算程式
批處理(Batch):在有限的時間內執行並運行到完成的處理,完成後釋放計算資源
由此可見Spark Streaming其實是批處理。
我們可以使用任一類型的處理模型來處理任一類型的數據集,但不一定是最優的方案。事實上在以前我們一直在用批處理來處理無界數據集,甚至是現在依然在用。
多樣的部署方式
Flink提供了多種集群搭建方式:
- standalone cluster模式:不依賴於任何第三方資源管理器,Flink可以作為獨立的集群運行
- 基於第三方資源管理器:Flink與所有常見的集群資源管理器(如Hadoop YARN,Apache Mesos和Kubernetes集成)
- Local模式:顧名思義,就是本地單機模式。
支持任意數據規模
Flink與所有的大數據計算框架一樣,支持橫向擴展。也就是說,理論上Flink可以支持無限量的CPU、記憶體、磁碟和網路IO。