背壓(backpressure)監控
---------------------------------------------------
Flink的web接口提供了監控運行job的背壓行為的功能
一、背壓(back pressure)
如果你看到了一個任務的back pressure警告(如過高),則意味着該任務產生數據的速度要高於下游Operator消化的速度。數據沿着job的數據流圖向下游流動(如從source到sink),而背壓則是沿着相反的方向傳播,逆流而上。
以一個簡單的Source -> Sink的job為例,如果看到了一個關於Source的警告,則意味着Sink消化數據的速度慢於Source產生數據的速度,而Sink向上游的Source產生背壓。
二、取樣線程(Sampling Threads)
背壓的監控工作原理是從運行的任務重復地對堆棧軌跡(stack trace)取樣。JobManager對運行Job的各任務重復觸發Thread.getStackTrace()的調用。
圖1 取樣線程
如果取樣顯示一個任務線程卡在某個內部方法調用中(從網絡棧中請求緩存空間),則意味着該任務面臨着背壓的影響。
默認地,對於每一個任務,JobManager會每隔50ms觸發100次堆棧軌跡。我們在web接口中看到的比例說明了這些堆棧軌跡中有多少卡在了內部方法調用中,如0.01就表示100個堆棧軌跡中有一個卡在了方法調用中。背壓的狀態如下區分:
1. OK:0 <= Ratio <= 0.10
2. LOW:0.10 < Ratio <= 0.5
3. HIGH:0.50 < Ratio <= 1.0
為了使堆棧軌跡取樣不對Task Manager產生太大負荷,web接口僅每60s才刷新一次樣本。
三、配置
我們可以用如下配置關鍵字來設置Job Manager的樣本數量:
1. jobmanager.web.backpressure.refresh-interval:已有樣本過期並需要刷新時間間隔(默認:60000,1min)
2. jobmanager.web.backpressure.num-samples:確定背壓所需取樣的堆棧軌跡數量(默認:100)
3. jobmanager.web.backpressure.delay-between-samples:確定背壓取樣的時間區間(默認:50,50ms)
四、示例
web接口中,我們可以在"Job overview"旁邊看到"Back pressure"選項卡
4.1 Sampling in progress
該狀態意味着JobManager出發了一個運行中的任務的堆棧軌跡取樣,默認配置下,該操作需要約5秒。
在此界面,我們點擊某行,則會觸發對該Operator的所有子任務的取樣操作。
圖2 Sampling in progress
4.2 背壓狀態
如果我們看到某任務的狀態是OK,則表示沒有背壓的跡象。反之,HIGH則表示該任務正受到背壓的影響。
圖3-1 背壓狀態OK
圖3-2 背壓狀態HIGH