背压(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