Flink是什么?
Flink是一個框架,是一個用于有限(bounded)或者無限(unbounded)數(shù)據(jù)流上進(jìn)行有狀態(tài)計算的分布式處理引擎。
處理框架
Flink的軟件棧如圖一所示,其核心是distributed dataflow engine用于執(zhí)行數(shù)據(jù)流處理程序。Flink運行時程序是一個通過有狀態(tài)的算子連接的數(shù)據(jù)流的有向無環(huán)圖(DAG),對上提供有限數(shù)據(jù)流的DataSet API和無限數(shù)據(jù)流的DataStream API。
如圖二所示,F(xiàn)link集群包含三類角色,client、JobManager和TaskManager。client將數(shù)據(jù)處理程序轉(zhuǎn)換為DAG圖并提交到JobManager。JobManager協(xié)調(diào)程序的執(zhí)行,并跟蹤每一個算子的狀態(tài)以實現(xiàn)故障恢復(fù)。TaskManager從JobManager處接收需要部署的Task,負(fù)責(zé)具體數(shù)據(jù)處理程序的執(zhí)行,一個TaskManager執(zhí)行一個或者多個算子處理數(shù)據(jù)流,并將狀態(tài)上報至JobManager。
這里的算子就是一個獨立數(shù)據(jù)處理程序,常用的有map、flatmap、keyBY、sum、Apply、reduce、window等。其中,map和flatMap的區(qū)別是map是一對一的映射,既一個輸入對應(yīng)一個輸出。faltMap是一對多映射,一個輸入對應(yīng)0個或者多個輸出。
通過上述論述,F(xiàn)link程序的實質(zhì)就是用多個算子組合在一起形成一個有向無環(huán)圖,理解了這一點flink的程序就不難理解了。下面有個簡單的例子:
簡單示例
Time
在Flink中定義了三種時間概念,分別是Event Time,Ingestion Time和Processing Time。
Processing Time顧名思義就是處理收到事件的系統(tǒng)時間,由于它不需要要數(shù)據(jù)流和處理機(jī)器間的時間協(xié)調(diào),所以具備最低的延遲。但是,在分布式和異步的環(huán)境下,Processing Time不能提供確定性,因為它容易受到事件到達(dá)Flink系統(tǒng)的速度、事件在Flink系統(tǒng)內(nèi)操作流動的速度以及中斷的影響。
Event Time是事件發(fā)生時間,一般指的是數(shù)據(jù)本身攜帶的時間戳。Event Time 程序必須指定如何生成 Event Time 水印,這是表示 Event Time 進(jìn)度的機(jī)制。理想的情況是,無論事件什么時候到達(dá)或者其怎么排序,最后處理Event Time將產(chǎn)生完全一致和確定的結(jié)果。但是,實際上除非事件按照已知順序(按照事件的時間)到達(dá),否則處理 Event Time 時將會因為要等待一些無序事件而產(chǎn)生延遲。由于Flink程序只能等待一段有限的時間,因此就難以保證處理Event Time將產(chǎn)生完全一致和確定的結(jié)果。
Ingestion Time是事件進(jìn)入flink系統(tǒng)的時間。Ingestion Time 程序無法處理任何無序事件或延遲數(shù)據(jù),但程序不必指定如何生成水印。在 Flink 中,Ingestion Time 與 Event Time 非常相似,但 Ingestion Time 具有自動分配時間戳和自動生成水印功能。
三個時間之間的關(guān)系通過一張圖可以形象的顯示出來:
參考
Apache Flink: Stream and Batch Processing in a Single Engine
https://ci.apache.org/projects/flink/flink-docs-stable/dev/event_time.html
https://segmentfault.com/a/1190000017874211