flink有批處理和流處理的計算功能,其中批處理是用流計算來模擬,更多數據處理見:https://segmentfault.com/a/11...,分佈式部署;計算相關的並行模式,流處理時間窗口,容錯處理,增量計算等。
官方:https://flink.apache.orghtml
在 Hadoop 中 Map 和 Reduce 是兩個獨立調度的 Task,而且都會去佔用計算資源。對 Flink 來講 MapReduce 是一個 Pipeline 的 Task,只佔用一個計算資源web
https://ci.apache.org/project...
以上有6個源,6個map,6個reduce。在2個TM(每一個3個slots)的並行執行方式以下算法
其中每一個可並行的有一個JV和並行的EV.好比source會在一個JV中保含6個EV,ExecutionGraph還包含IntermediateResult和IntermediateResultPartition。前者跟蹤IntermediateDataSet的狀態,後者是每一個分區的狀態。apache
1)傾斜窗口(Tumbling Windows,記錄沒有重疊,固定窗口大小時間間隔)
2)滑動窗口(Slide Windows,記錄有重疊,固定窗口大小和窗口間隔)
3)會話窗口(Session Windows,在內部,會話窗口操做員爲每一個到達的記錄建立一個新窗口,若是它們彼此之間的距離比定義的間隙更接近,則將窗口合併在一塊兒。爲了可合併的,會話窗口操做者須要一個合併觸發器和一個合併 的窗函數)
4)全局窗口 全局窗口自動以觸發器,自定義聚合方式等,
能夠基於時間或數據計數(https://flink.apache.org/news...)segmentfault
事件時間,到達時間,處理時間
基於事件時間(事件建立時間)的水位線watermark算法(延後固定或推理出的關係式個時長,以便排除事件發生處處理的時長,來收集此刻建立的事件流):windows
當一、watermark時間 >= window_end_time(對於out-of-order以及正常的數據而言)&& 二、在[window_start_time,window_end_time)中有數據存在 時窗口關閉開始計算
以下圖:設定的maxOutOfOrderness=10000L(10s),窗口3s緩存
按期水位線
用戶定義maxOutOfOrderness,兩次水位線之間的數據能夠用來調用方法生成下一次的時間,再日後推遲maxOutOfOrderness的時間便可。好比多線程
class BoundedOutOfOrdernessGenerator extends AssignerWithPeriodicWatermarks[MyEvent] { val maxOutOfOrderness = 3500L; // 3.5 seconds var currentMaxTimestamp: Long; override def extractTimestamp(element: MyEvent, previousElementTimestamp: Long): Long = { val timestamp = element.getCreationTime() currentMaxTimestamp = max(timestamp, currentMaxTimestamp) timestamp; } override def getCurrentWatermark(): Watermark = { // return the watermark as current highest timestamp minus the out-of-orderness bound new Watermark(currentMaxTimestamp - maxOutOfOrderness); } }
對齊
(google的millwheel用的每一個數據生成惟一編號,dedup去重實現exactly-once(milwheel)) 接收到一個流的n後,這個流的數據暫存,直到其餘流也到n,對其發出快照。避免特定狀況下Shuffle、排序等昂貴操做,中間結果有必要進行緩存架構
Flink執行批處理程序做爲流程序的特殊狀況,其中流是有界的(有限數量的元素)。所以,上述概念以相同的方式應用於批處理程序,而且它們適用於流程序,除了少數例外:
批處理程序的容錯不使用檢查點。經過徹底重放流來進行恢復。成本更低。
支持迭代計算。機器學習