flink發(fā)展歷史
在 2008 年,F(xiàn)link 的前身已經(jīng)是柏林理工大學(xué)一個研究性項目, 在 2014 被 Apache 孵化器所接受,然后迅速地成為了 ASF(Apache Software Foundation)的頂級項目之一
Flink 是一個針對流數(shù)據(jù)和批數(shù)據(jù)的分布式處理引擎。它主要是由 Java 代碼實現(xiàn)。目前主要還是依靠開源社區(qū)的貢獻(xiàn)而發(fā)展。對 Flink 而言,其所要處理的主要場景就是流數(shù)據(jù),批數(shù)據(jù)只是流數(shù)據(jù)的一個極限特例而已。再換句話說,F(xiàn)link 會把所有任務(wù)當(dāng)成流來處理,這也是其最大的特點。
flink架構(gòu)介紹
從部署上講,F(xiàn)link支持三種模式 :
- local模式
- 集群模式(standalone集群或者Yarn集群)
- 云端部署
兩種應(yīng)用程序接口:
- DataStream API (流處理)
- DataSet API (批處理)
當(dāng)程序在編譯時,生成JobGraph。編譯完成后,根據(jù)API的不同,優(yōu)化器(批或流)會生成不同的執(zhí)行計劃。根據(jù)部署方式的不同,優(yōu)化后的JobGraph被提交給了executors去執(zhí)行。

flink作業(yè)調(diào)度模型
如圖所示,Client、JobManager 和 TaskManager。
Client 用來提交任務(wù)給 JobManager,JobManager 分發(fā)任務(wù)給 TaskManager 去執(zhí)行,然后 TaskManager 會心跳的匯報任務(wù)狀態(tài)。

flink框架特性
高性能
支持高吞吐、低延遲、高性能的流處理。有狀態(tài)計算的Exactly-once語義
有狀態(tài)意味著程序可以保持已經(jīng)處理過的數(shù)據(jù),同時Flink的checkpoint機制可以確保在發(fā)生故障時應(yīng)用程序狀態(tài)的一致性語義。高度靈活的窗口
Flink支持?jǐn)?shù)據(jù)驅(qū)動的窗口,這意味著我們可以基于時間(event time或processing time)、count和session來構(gòu)建窗口。容錯機制
它使得系統(tǒng)既能保持高的吞吐率又能保證exactly-once的一致性,使Flink能從零數(shù)據(jù)丟失的故障中恢復(fù),通過分布式狀態(tài)快照(Snapshot)實現(xiàn)內(nèi)存管理
Flink在JVM內(nèi)部進(jìn)行內(nèi)存的自我管理,使得其獨立于java本身的垃圾回收機制。當(dāng)處理hash、index、caching和sorting時,F(xiàn)link自我的內(nèi)存管理方式使得這些操作很高效。但是,目前自我的內(nèi)存管理只在批處理中實現(xiàn),流處理程序并未使用。優(yōu)化器
避免特定情況下Shuffle、排序等昂貴操作,中間結(jié)果進(jìn)行緩存,確保避免過度的磁盤IO。批流統(tǒng)一
運行時同時支持流計算和批計算兩套API。
Flink中的流處理優(yōu)先原則,認(rèn)為批處理是流處理的一種特殊情況。Libraries庫
Flink提供了用于機器學(xué)習(xí)、圖計算、Table API等庫,同時Flink也支持復(fù)雜的CEP處理和警告。事件時間
Flink支持Event Time語義的處理,這有助于處理流計算中的亂序問題,有些數(shù)據(jù)也許會遲到,我們可以通過基于event time、count、session的窗口來處于這樣的場景。savepoints 狀態(tài)版本控制
可以將應(yīng)用的運行狀態(tài)保存下來,使得在升級應(yīng)用或處理歷史數(shù)據(jù)時,而不會丟失狀態(tài)和確保宕機時間最小反壓
支持具有反壓(Backpressure)功能的持續(xù)流模型