反压是流式Shuffle中的一个重要概念,当下游处理能力不足时,会通知上游停止发送数据,从而避免数据丢失。本文为您介绍典型的反压场景及优化思路。

反压检测机制

实时计算3.0以上版本提供了作业反压检测机制,通过检测Vertex(可以理解为多个关联Chain在一起的Operator组)输出网络Buffer的拥塞情况,判断对应的Vertex是否存在反压。具体步骤如下:
  1. 登录作业运维页面。
    1. 登录实时计算控制台
    2. 单击页面顶部的运维
    3. 作业列表区域,单击作业名称下的目标作业名。
  2. 运行信息 > Vertex拓扑,单击对应的节点边框。

  3. 在右侧信息区域的BackPressure > Status,查看反压状态。
    • 红色high:表示该节点存在反压。
    • 绿色ok:表示该节点不存在反压。

反压场景及优化思路

说明 示意图中Vertex的颜色为绿色表示通过以上的检测显示不存在反压,红色表示存在反压。
  • 仅存在1个Vertex,经检测无反压

    由于Flink的特性,在最后一个Vertex的输出上没有设置网络Buffer(直接写出到下游存储),当作业仅存在一个(或最后一个)Vertex时,反压检测机制失效。因此以上Vertex拓扑示意图并不表示作业不存在反压,若需进一步判断反压点,需将Vertex0中的Operator拆分后再进行判断。拆分方法参见资源调优

  • 存在多个Vertex,倒数第2个Vertex经检测存在反压

    该场景表示:Vertex1被反压,性能瓶颈点在Vertex2。此时,可以通过查看Vertex2中的Operator组的名称进行判断:
    • 若只涉及写出下游存储的操作,则可能是写出速度较慢所导致。建议增加Vertex2的并发数,或者配置对应结果表(Sink)的batchsize参数,具体操作步骤请参见上下游参数调优
    • 若涉及到除写出下游存储外的其他操作,需要将其他操作对应的Operator拆分后再进一步判断。拆分方法参见资源调优
  • 存在多个Vertex,非倒数第2个Vertex经检测存在反压

    该场景表示:Vertex0被反压,性能瓶颈点在Vertex1。此时,可以通过查看Vertex1中的Operator组的名称来判断具体的操作。常见的操作和对应的优化方法如下:
    • GROUP BY操作:可以考虑增加并发或设置miniBatch参数优化状态(State)的操作,具体方法参见作业参数调优
    • 维表JOIN操作:可以考虑增加并发数或者设置维表的Cache策略,具体请参见对应维表文档。
    • UDX操作:可以考虑增加并发数或者优化对应的UDX代码。
  • 存在多个Vertex,所有Vertex经检测不存在反压

    该场景表示:可能的性能瓶颈点在Vertex0,可以通过查看Vertex0中的Operator组的名称判断具体的操作。
    • 若其中只存在读取上游源表(Source)的操作,则可能实时计算本身没有性能瓶颈,只是读取Source的速度较慢而导致延时较大。此时可通过增加Source节点的并发数或者设置读取Source的batchsize的方法进行优化,具体步骤参见上下游参数调优
      说明 Source节点增加后的并发数不能大于上游存储的Shard数。
    • 若其中除读取上游Source的操作外,还存在其他操作,建议将其他操作的Operator拆分后再进一步判断,拆分方法参见资源调优
  • 存在多个Vertex,其中1个Vertex经检测存在反压,但其后续的多个并行Vertex经检测不存在反压

    该场景表示:Vertex0被反压,但是无法直接判断性能瓶颈点是Vertex1还是Vertex2。您可以通过Vertex1和Vertex2的IN_Q指标做初步判断,如果对应的IN_Q长时间为100%,则此节点极可能存在性能瓶颈点。若需要进一步确认,则需将此节点拆分后进行进一步判断。拆分方法参见资源调优