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






