我正在学习如何用flink处理流数据。
我已经成功地编写了一个示例,它从数据源接收并反序列化流数据,转换并打印输出。
现在我在考虑如何处理flink中oom的异常。
例如,如果存在一些背压问题,也就是说,如果从数据源发送数据的速度比在flink的操作符中处理数据的速度快,据我所知,ram将在一段时间内耗尽。如果这案子发生了呢?如何处理这种异常?有没有可能忽略一些输入,这样进程就不会导致任何错误?
换言之,我期待一些机制如下:
if (RAM is almost exhausted)
ignore the coming data
else
process the coming data
1条答案
按热度按时间ozxc1zmp1#
你想象的机制并不存在。你可以自己建造它,但这似乎是解决问题的错误方法。
背压不会导致flink出现异常。它的网络堆栈使用固定大小的堆外网络缓冲池以及基于信用的流控制。任务不能向下游发送数据,除非它已经在接收器中分配了缓冲区。这意味着数据源可以快速适应管道中最慢任务的容量。因此,与忽略传入的数据不同,数据源自然会自我调节,避免读取无法发送到下游的数据。
oom错误的唯一可能原因是,随着时间的推移,应用程序使用越来越多的键控状态和计时器。您可以通过多种方式解决此问题:
使用rocksdb state后端(它将状态保存在本地磁盘上,外加一个堆外缓存)
尽可能使用预聚合
更积极地清理过时密钥的状态