我正在学习如何使用Flink处理流数据。
我已经成功地编码了一个例子,就是接收和反序列化来自数据源的流数据,对其进行转换并打印输出。
现在我在思考如何在Flink中处理OOM的异常。
比如说,如果存在一些背压的问题,也就是说,如果数据源发送数据的速度比Flink的运算器处理数据的速度快,按照我的理解,过一段时间RAM就会耗尽。那么如果发生这种情况怎么办呢?如何处理这种异常呢?是否可以忽略一些输入,这样处理过程就不会引起任何错误?
换句话说,我希望有如下的机制。
if (RAM is almost exhausted)
ignore the coming data
else
process the coming data
你想象中的机制并不存在。你可以自己构建,但感觉解决这个问题的方法不对。
背压在Flink中不会引起OOM异常。它的网络栈使用固定大小的离堆网络缓冲池以及基于信用的流量控制。一个任务不能向下游发送数据,除非它已经在接收器中分配了一个缓冲区。这意味着数据源可以迅速适应管道中最慢的任务的容量。因此,数据源不会忽略传入的数据,而是自然而然地自我节流,避免读取无法向下游发送的数据。
唯一可能导致OOM错误的原因是,随着时间的推移,你的应用程序使用了越来越多的键控状态和定时器。你可以通过多种方式来解决这个问题。