新一代大数据处理引擎 Apache Flink
這幾年大數(shù)據(jù)的飛速發(fā)展,出現(xiàn)了很多熱門的開源社區(qū),其中著名的有 Hadoop、Storm,以及后來的 Spark,他們都有著各自專注的應(yīng)用場景。Spark 掀開了內(nèi)存計算的先河,也以內(nèi)存為賭注,贏得了內(nèi)存計算的飛速發(fā)展。Spark 的火熱或多或少的掩蓋了其他分布式計算的系統(tǒng)身影。就像 Flink,也就在這個時候默默的發(fā)展著。
在國外一些社區(qū),有很多人將大數(shù)據(jù)的計算引擎分成了 4 代,當(dāng)然,也有很多人不會認(rèn)同。我們先姑且這么認(rèn)為和討論。
首先第一代的計算引擎,無疑就是 Hadoop 承載的 MapReduce。這里大家應(yīng)該都不會對 MapReduce 陌生,它將計算分為兩個階段,分別為 Map 和 Reduce。對于上層應(yīng)用來說,就不得不想方設(shè)法去拆分算法,甚至于不得不在上層應(yīng)用實現(xiàn)多個 Job 的串聯(lián),以完成一個完整的算法,例如迭代計算。
由于這樣的弊端,催生了支持 DAG 框架的產(chǎn)生。因此,支持 DAG 的框架被劃分為第二代計算引擎。如 Tez 以及更上層的 Oozie。這里我們不去細(xì)究各種 DAG 實現(xiàn)之間的區(qū)別,不過對于當(dāng)時的 Tez 和 Oozie 來說,大多還是批處理的任務(wù)。
接下來就是以 Spark 為代表的第三代的計算引擎。第三代計算引擎的特點主要是 Job 內(nèi)部的 DAG 支持(不跨越 Job),以及強(qiáng)調(diào)的實時計算。在這里,很多人也會認(rèn)為第三代計算引擎也能夠很好的運(yùn)行批處理的 Job。
隨著第三代計算引擎的出現(xiàn),促進(jìn)了上層應(yīng)用快速發(fā)展,例如各種迭代計算的性能以及對流計算和 SQL 等的支持。Flink 的誕生就被歸在了第四代。這應(yīng)該主要表現(xiàn)在 Flink 對流計算的支持,以及更一步的實時性上面。當(dāng)然 Flink 也可以支持 Batch 的任務(wù),以及 DAG 的運(yùn)算。
或許會有人不同意以上的分類,我覺得其實這并不重要的,重要的是體會各個框架的差異,以及更適合的場景。并進(jìn)行理解,沒有哪一個框架可以完美的支持所有的場景,也就不可能有任何一個框架能完全取代另一個,就像 Spark 沒有完全取代 Hadoop,當(dāng)然 Flink 也不可能取代 Spark。本文將致力描述 Flink 的原理以及應(yīng)用。
Flink 簡介
很多人可能都是在 2015 年才聽到 Flink 這個詞,其實早在 2008 年,Flink 的前身已經(jīng)是柏林理工大學(xué)一個研究性項目, 在 2014 被 Apache 孵化器所接受,然后迅速地成為了 ASF(Apache Software Foundation)的頂級項目之一。Flink 的最新版本目前已經(jīng)更新到了 0.10.0 了,在很多人感慨 Spark 的快速發(fā)展的同時,或許我們也該為 Flink 的發(fā)展速度點個贊。
Flink 是一個針對流數(shù)據(jù)和批數(shù)據(jù)的分布式處理引擎。它主要是由 Java 代碼實現(xiàn)。目前主要還是依靠開源社區(qū)的貢獻(xiàn)而發(fā)展。對 Flink 而言,其所要處理的主要場景就是流數(shù)據(jù),批數(shù)據(jù)只是流數(shù)據(jù)的一個極限特例而已。再換句話說,Flink 會把所有任務(wù)當(dāng)成流來處理,這也是其最大的特點。Flink 可以支持本地的快速迭代,以及一些環(huán)形的迭代任務(wù)。并且 Flink 可以定制化內(nèi)存管理。在這點,如果要對比 Flink 和 Spark 的話,Flink 并沒有將內(nèi)存完全交給應(yīng)用層。這也是為什么 Spark 相對于 Flink,更容易出現(xiàn) OOM 的原因(out of memory)。就框架本身與應(yīng)用場景來說,Flink 更相似與 Storm。如果之前了解過 Storm 或者 Flume 的讀者,可能會更容易理解 Flink 的架構(gòu)和很多概念。下面讓我們先來看下 Flink 的架構(gòu)圖。
圖 1. Flink 架構(gòu)圖
如圖 1 所示,我們可以了解到 Flink 幾個最基礎(chǔ)的概念,Client、JobManager 和 TaskManager。Client 用來提交任務(wù)給 JobManager,JobManager 分發(fā)任務(wù)給 TaskManager 去執(zhí)行,然后 TaskManager 會心跳的匯報任務(wù)狀態(tài)。看到這里,有的人應(yīng)該已經(jīng)有種回到 Hadoop 一代的錯覺。確實,從架構(gòu)圖去看,JobManager 很像當(dāng)年的 JobTracker,TaskManager 也很像當(dāng)年的 TaskTracker。然而有一個最重要的區(qū)別就是 TaskManager 之間是是流(Stream)。其次,Hadoop 一代中,只有 Map 和 Reduce 之間的 Shuffle,而對 Flink 而言,可能是很多級,并且在 TaskManager 內(nèi)部和 TaskManager 之間都會有數(shù)據(jù)傳遞,而不像 Hadoop,是固定的 Map 到 Reduce。
Flink 中的調(diào)度簡述
在 Flink 集群中,計算資源被定義為 Task Slot。每個 TaskManager 會擁有一個或多個 Slots。JobManager 會以 Slot 為單位調(diào)度 Task。但是這里的 Task 跟我們在 Hadoop 中的理解是有區(qū)別的。對 Flink 的 JobManager 來說,其調(diào)度的是一個 Pipeline 的 Task,而不是一個點。舉個例子,在 Hadoop 中 Map 和 Reduce 是兩個獨(dú)立調(diào)度的 Task,并且都會去占用計算資源。對 Flink 來說 MapReduce 是一個 Pipeline 的 Task,只占用一個計算資源。類同的,如果有一個 MRR 的 Pipeline Task,在 Flink 中其也是一個被整體調(diào)度的 Pipeline Task。在 TaskManager 中,根據(jù)其所擁有的 Slot 個數(shù),同時會擁有多個 Pipeline。
在 Flink StandAlone 的部署模式中,這個還比較容易理解。因為 Flink 自身也需要簡單的管理計算資源(Slot)。當(dāng) Flink 部署在 Yarn 上面之后,Flink 并沒有弱化資源管理。也就是說這時候的 Flink 在做一些 Yarn 該做的事情。從設(shè)計角度來講,我認(rèn)為這是不太合理的。如果 Yarn 的 Container 無法完全隔離 CPU 資源,這時候?qū)?Flink 的 TaskManager 配置多個 Slot,應(yīng)該會出現(xiàn)資源不公平利用的現(xiàn)象。Flink 如果想在數(shù)據(jù)中心更好的與其他計算框架共享計算資源,應(yīng)該盡量不要干預(yù)計算資源的分配和定義。
需要深度學(xué)習(xí) Flink 調(diào)度讀者,可以在 Flink 的源碼目錄中找到 flink-runtime 這個文件夾,JobManager 的 code 基本都在這里。
Flink 的生態(tài)圈
一個計算框架要有長遠(yuǎn)的發(fā)展,必須打造一個完整的 Stack。不然就跟紙上談兵一樣,沒有任何意義。只有上層有了具體的應(yīng)用,并能很好的發(fā)揮計算框架本身的優(yōu)勢,那么這個計算框架才能吸引更多的資源,才會更快的進(jìn)步。所以 Flink 也在努力構(gòu)建自己的 Stack。
Flink 首先支持了 Scala 和 Java 的 API,Python 也正在測試中。Flink 通過 Gelly 支持了圖操作,還有機(jī)器學(xué)習(xí)的 FlinkML。Table 是一種接口化的 SQL 支持,也就是 API 支持,而不是文本化的 SQL 解析和執(zhí)行。對于完整的 Stack 我們可以參考下圖。
圖 2. Flink 的 Stack
Flink 為了更廣泛的支持大數(shù)據(jù)的生態(tài)圈,其下也實現(xiàn)了很多 Connector 的子項目。最熟悉的,當(dāng)然就是與 Hadoop HDFS 集成。其次,Flink 也宣布支持了 Tachyon、S3 以及 MapRFS。不過對于 Tachyon 以及 S3 的支持,都是通過 Hadoop HDFS 這層包裝實現(xiàn)的,也就是說要使用 Tachyon 和 S3,就必須有 Hadoop,而且要更改 Hadoop 的配置(core-site.xml)。如果瀏覽 Flink 的代碼目錄,我們就會看到更多 Connector 項目,例如 Flume 和 Kafka。
總結(jié)
以上是生活随笔為你收集整理的新一代大数据处理引擎 Apache Flink的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把远程仓库的项目,clone到eclip
- 下一篇: scikit-learn学习笔记(六)D