Flink sql 之 AsyncIO與LookupJoin的幾個疑問 (源碼分析)


本文源碼基於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的,但是往下游發的時候還是按順序的。

所以不會亂序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM