【FlinkSql】一、基本瞭解
一、FlinkSQL
動態表,流表二象性。所謂動態表,就是資料會隨著時間變化的表,可以想象成就是資料庫中一張被不斷更新的表。
二、流式 SQL 可以想象成連續查詢
連續查詢會一直執行在那裡,當每個資料到來,都會持續增量地更新計算結果,從而產生另一個動態表。而這個結果動態表(也就是流)會作為另一個 SQL(連續查詢)的輸入接著計算,從而串起整個資料流圖。
三、功能
雙流 JOIN,維表 JOIN,TopN,Window,多路輸出。TopN 是統計報表和大屏非常常見的功能,主要用來實時計算排行榜。除了全域性 TopN 功能外,我們還提供了分組 TopN 的功能。
四、優化
MiniBatch 就是核心優化之一。對於有狀態的運算元來說,每個進入運算元的元素都需要對狀態做序列化/反序列化的操作,頻繁的狀態序列化/反序列化操作佔了效能開銷的大半。MiniBatch 的核心思想是,對進入運算元的元素進行攢批,一批資料只需要對狀態序列化/反序列化一次即可。
Retraction 撤回機制:early-fire 導致的結果正確性問題(所有的 GroupBy 都是 early-fire 的)。
五、細化優化
維表 JOIN:常見的需求就是為資料流補齊欄位,商品維,地點維,使用者維。
非同步模式可以併發地處理多個請求和回覆。也就是說,你可以連續地向資料庫傳送使用者a
、b
、c
等的請求,與此同時,哪個請求的回覆先返回了就處理哪個回覆,從而連續的請求之間不需要阻塞等待。
AsyncDataStream.(un)orderedWait
的主要工作就是建立了一個AsyncWaitOperator,會執行
AsyncFunction
並處理非同步返回的結果。AsyncWaitOperator
StreamElementQueue
和Emitter。Emitter 就會從佇列中拉取完成的 Promise ,並從 Promise 中取出訊息傳送給下游。所有新進入該運算元的元素(包括 watermark),都會包裝成 Promise 並按到達順序放入該佇列
topN:最優的流式 TopN 的計算只需要維護一個 N 元素大小的小根堆,每當有資料到達時,只需要與堆頂元素比較,如果比堆頂元素還小,則直接丟棄;如果比堆頂元素大,則更新小根堆,並輸出更新後的排行榜。MapState 結構,MapState 是 Flink 提供的狀態介面,用來儲存 TopN 的資料(保證資料不丟)。
巢狀topN:計算全網排名前十的商鋪,會導致單點的資料熱點,那麼可以先加一層分組 TopN,組的劃分規則是根據店鋪 ID 雜湊取模後分成128組(併發的倍數)。第二層 TopN 與原先的寫法一樣,沒有 PARTITION BY。第一層會計算出每一組的 TopN,而後在第二層中進行合併彙總,得到最終的全網前十。第二層雖然仍是單點,但是大量的計算量由第一層分擔了,而第一層是可以水平擴充套件的
retract就是傳統資料裡面的更新操作。
這時,第一層group by的會先向下游傳送一條 (0001,中通)的撤回訊息,第二層group by節點收到撤回訊息後,會將這個節點 中通對應的 value減少1,並更新到結果表中;
第一層的分桶統計邏輯向下遊正常傳送(0001,圓通)的正向訊息,更新了圓通物流對應的訂單數目,達到了最初的彙總目的。
開啟minibatch:
# 表示整個job允許的延遲(必須引數)
blink.miniBatch.allowLatencyMs=5000
# 單個batch的size(可選引數)
blink.miniBatch.size=1000