一、數(shù)據(jù)傳輸形式
Stream在算子之間傳輸數(shù)據(jù)的形式可以是one-to-one(forwarding)的模式也可以是redistributing的模式,具體是哪一種形式,取決于算子的種類。
- One-to-one:
stream(比如在source和map operator之間)維護(hù)著分區(qū)以及元素的順序。那意味著flatmap 算子的子任務(wù)看到的元素的個(gè)數(shù)以及順序跟source 算子的子任務(wù)生產(chǎn)的元素的個(gè)數(shù)、順序相同,map、fliter、flatMap等算子都是one-to-one的對應(yīng)關(guān)系。類似于spark中的窄依賴 - Redistributing:
stream(map()跟keyBy/window之間或者keyBy/window跟sink之間)的分區(qū)會(huì)發(fā)生改變。每一個(gè)算子的子任務(wù)依據(jù)所選擇的transformation發(fā)送數(shù)據(jù)到不同的目標(biāo)任務(wù)。例如,keyBy()基于hashCode重分區(qū)、broadcast和rebalance會(huì)隨機(jī)重新分區(qū),這些算子都會(huì)引起redistribute過程,而redistribute過程就類似于Spark中的shuffle過程。類似于spark中的寬依賴。
二、任務(wù)鏈合并
- Flink 采用了一種稱為任務(wù)鏈的優(yōu)化技術(shù),可以在特定條件下減少本地通信的開銷。為了滿足任務(wù)鏈的要求,必須將兩個(gè)或多個(gè)算子設(shè)為相同的并行度,并通過本地轉(zhuǎn)發(fā)(local forward)的方式進(jìn)行連接
- 相同并行度的 one-to-one 操作,F(xiàn)link 這樣相連的算子鏈接在一起形成一個(gè) task,原來的算子成為里面的 subtask
并行度相同、并且是 one-to-one 操作,兩個(gè)條件缺一不可

三、代碼使用
env.disableOperatorChaining();//全局禁用任務(wù)鏈合并
dataStreamSource.flatMap().disableChaining(); //將某算子禁用任務(wù)鏈合并
dataStreamSource.flatMap().startNewChain(); //flatmap前是一個(gè)任務(wù)鏈,后面是一個(gè)任務(wù)鏈