反压笔记
?
定位反壓節(jié)點(diǎn) 要解決反壓首先要做的是定位到造成反壓的節(jié)點(diǎn),這主要有兩種辦法 :
1. 通過 Flink Web UI 自帶的反壓監(jiān)控面板;
2. 通過 Flink Task Metrics。
?
如果處于反壓狀態(tài),那么有兩種可能性:
1. 該節(jié)點(diǎn)的發(fā)送速率跟不上它的產(chǎn)生數(shù)據(jù)速率。這一般會(huì)發(fā)生在一條輸入多條 輸出的 Operator(比如 flatmap)。
2. 下游的節(jié)點(diǎn)接受速率較慢,通過反壓機(jī)制限制了該節(jié)點(diǎn)的發(fā)送速率。
如果是第一種狀況,那么該節(jié)點(diǎn)則為反壓的根源節(jié)點(diǎn),它是從 Source Task 到 Sink Task 的第一個(gè)出現(xiàn)反壓的節(jié)點(diǎn)。
如果是第二種情況,則需要繼續(xù)排查下游節(jié)點(diǎn)。
值得注意的是,反壓的根源節(jié)點(diǎn)并不一定會(huì)在反壓面板體現(xiàn)出高反壓,面板監(jiān)控的是發(fā)送端,如果某個(gè)節(jié)點(diǎn)是性能瓶頸并不會(huì)導(dǎo)致它本身出現(xiàn)高反壓,而是 導(dǎo)致它的上游出現(xiàn)高反壓。
總體來看,如果我們找到第一個(gè)出現(xiàn)反壓的節(jié)點(diǎn),那么反壓根源要么是就這個(gè)節(jié)點(diǎn),要么是它緊接著的下游節(jié)點(diǎn)。
?
分析反壓的大致思路是:
如果一個(gè) Subtask 的發(fā)送端 Buffer 占用率很高,則表 明它被下游反壓限速了;
如果一個(gè) Subtask 的接受端 Buffer 占用很高,則表明它將 反壓傳導(dǎo)至上游。
反壓情況可以根據(jù)以下表格進(jìn)行對號(hào)入座 ( 圖片來自官網(wǎng) ):
?
?
對于 Flink 1.9 及以上版本,除了上述的表格,我們還可以根據(jù) floatingBuffersUsage/exclusiveBuffersUsage 以及其上游 Task 的 outPoolUsage 來進(jìn)行進(jìn)一 步的分析一個(gè) Subtask 和其上游 Subtask 的數(shù)據(jù)傳輸。
?
通常來說,floatingBuffersUsage 為高則表明反壓正在傳導(dǎo)至上游,而 exclusiveBuffersUsage 則表明了反壓是否存在傾斜(floatingBuffersUsage 高、exclusiveBuffersUsage 低為有傾斜,因?yàn)樯贁?shù) channel 占用了大部分的 Floating Buffer)。
分析具體原因及處理
在實(shí)踐中,很多情況下的反壓是由于數(shù)據(jù)傾斜造成的。
此外,最常見的問題可能是用戶代碼的執(zhí)行效率問題(頻繁被阻塞或者性能問 題)。
另外 TaskManager 的內(nèi)存以及 GC 問題也可能會(huì)導(dǎo)致反壓。
?
?
?
?
?
總結(jié)
                            
                        - 上一篇: iperf测试局域网网速(集群IO网速)
 - 下一篇: ipadair5买多大内存合适 ipad