本文源碼基於flink 1.14
被同事問到幾個關於AsyncIO和lookUp維表的問題所以翻了下源碼,從源碼的角度解惑這幾個問題
對於AsyncIO不了解的可以看看之前寫的這篇 《Flink中異步AsyncIO的實現 (源碼分析)》
問題一:AsyncIO 有(排序 / 非排序) 模式,非排序模式數據會亂序,那水印waterMarker會亂序嗎 ???
不想看源碼的先直接給出答案
:不會亂序,接收到水印數據后非排序模式會,直接往下游發送waterMarker
問題二:LookUp維表join分為同步和Async, 上面異步非排序,數據會亂序水印不會,那sql的維表異步join數據會亂序嗎 ???
:不會亂序,源碼中默認都是AsyncIO的排序(Ordered)模式
ok上源碼
問題一:AsyncIO水印會亂序嗎?
來看一下異步io對應的StreamOperator的源碼 org.apache.flink.streaming.api.operators.async.AsyncWaitOperator
異步io接收到數據以后,加入到queue里面,然后調用用戶寫的UserFunction
異步io接收到水印以后,同樣加入到queue里面
那繼續看addToWorkQueue方法接收到水印以后
加入具體的queue
繼續,這里只看非排序的unordered
也是一樣直接加addWtaermark()
將水印包裝成一個WatermarkQueueEntry對象直接放queue
ok那來看下這個watermarkQueueEntry類
可以看到當水印進入queue以后直接就是已完成的了,就可以直接往下游發送,管你其他異步處理的數據完成沒完成,水印已經往下發了
問題二:LookUp維表異步join會導致數據亂序嗎?
看下關於lookup的calcite的對應規則
調用鏈不看了,有點長來看最后生成的,execNode物理的relNode執行節點StreamExecLookupJoin
來看下它抽象類 CommonExecLookupJoin的translateToPlanInternal方法
最后走到 createAsyncLookupJoin 來看下如何生成AsyncIO的function的
ok 用的ordered模式的異步io,維表關聯的數據盡管是異步去join的,但是往下游發的時候還是按順序的。
所以不會亂序