Apache Flink中处理OOM异常的标准方法是什么

What is the standard way to handle exception of OOM in Apache Flink

我正在学习如何使用 Flink 处理流数据。

我已经成功地编写了一个示例,它是从数据源接收和反序列化流数据,对其进行转换并打印输出。

现在我在思考如何处理Flink中OOM的异常

比如,如果存在一些背压问题,也就是说如果数据源发送数据的速度快于Flink算子处理数据的速度,按照我的理解,RAM会在一段时间内被耗尽.那么如果发生这种情况怎么办?如何处理这种异常?是否可以忽略一些输入以使过程不会导致任何错误?

换句话说,我希望有如下机制:

if (RAM is almost exhausted)
    ignore the coming data
else
    process the coming data

你想象的机制并不存在。您可以自己构建它,但感觉这是解决问题的错误方法。

Backpressure在Flink中不会引起OOM异常。它的网络堆栈使用固定大小的堆外网络缓冲区池以及基于信用的流量控制。任务不能向下游发送数据,除非它已经在接收器中分配了缓冲区。这意味着数据源可以快速适应管道中最慢任务的容量。因此,源不会忽略传入的数据,而是自然地限制自己并避免读取它们无法发送到下游的数据。

OOM 错误的唯一可能原因是随着时间的推移,您的应用程序使用越来越多的键控状态和计时器。您可以通过多种方式解决此问题:

  • 使用 RocksDB 状态后端(将状态保存在本地磁盘上,外加堆外缓存)
  • 尽可能使用预聚合
  • 更积极地清理陈旧密钥的状态