Flink啓動job
bin/flink run examples/streaming/SocketWindowWordCount.jar --port 9000 nc -l 9000
Job執行流程
先看一下Flink內部調度流程
目前這個代碼沒有涉及水位watermark
並行度設置了1,每個並行度都會維護自己的水位,後邊文章我會拿代碼給家驗證。
時間類型
進去timewindow看一看,爲什麼說默認是proceetime,咱們進入源碼看看
進入environment.getStreamTimeCharacteristic() 這個方法
看看這個 return timeCharacteristic;返回的默認值是什麼?
大家發現DEFAULT_TIME_CHARACTERISTIC賦值給了timeCharacteristic,
咱們看看DEFAULT_TIME_CHARACTERISTIC這個默認值是什麼?
默認值是 TimeCharacteristic.ProcessingTime;
window觸發器
咱們點進
.keyBy("word")
.timeWindow(Time.seconds(5))
timewindow方法
進入window函數看看,返回的是windowstream
先看看windowAssigner,它主要是控制數據所在窗口按什麼規則觸發。
windowstream內部實現方法:
獲取輸入數據
獲取windowAssigner
獲取出發器
下面可以看到,窗口觸發之後,開始執行reduce操作
點擊reduce方法,觀察實現類,發現flink內部做了2步實現
第一步:清理改方法的歷史數據狀態,(不清除null,頂級清除top_level,遞歸清除RECURSIVE)
第二部:返回reduce(function, new PassThroughWindowFunction<K, W, T>());
看看new PassThroughWindowFunction<K, W, T>(),內部做了啥?
execute執行器
看看execute內部執行了什麼
點進去發現,執行的是個streamGraph
看看getStreamGraph,它內部如何實現的,發現有一個generate()方法
generater是創建builtStreamGraph