我正在使用IntervalJoin函数在10分钟内加入两个流。如下:
labelStream.intervalJoin(adLogStream)
.between(Time.milliseconds(0), Time.milliseconds(600000))
.process(new processFunction())
.sink(kafkaProducer)
labelStream和adLogStream是proto-buf类,由Long id键入。
我们的两个输入流非常庞大。运行约30分钟后,kafka的输出缓慢下降,如下所示:
当数据输出开始下降时,我使用jstack和pstack sevaral时间来获取这些信息:
该程序似乎卡在了rockdb的搜索中。而且我发现某些rockdb的srt文件是通过迭代缓慢访问的。
我尝试了几种方法:
1)Reduce the input amount to half. This works well.
2)Replace labelStream and adLogStream with simple Strings. This way, data amount will not change. This works well.
3)Use PredefinedOptions like SPINNING_DISK_OPTIMIZED and SPINNING_DISK_OPTIMIZED_HIGH_MEM. This still fails.
4)Use new versions of rocksdbjni. This still fails.
有人可以给我一些建议吗?非常感谢。
答案 0 :(得分:0)
一些想法:
您可以在flink用户邮件列表中询问-通常,与栈溢出相比,此类操作问题更有可能在邮件列表上引起有知识的响应。
我听说,如果RocksDB可以使用更多的堆外内存,则可以提供帮助,因为RocksDB会将其用于缓存。抱歉,但是我不知道如何配置它的任何详细信息。
也许增加并行度会有所帮助。
如果有可能,尝试使用基于堆的状态后端运行可能会很有趣,只是看看RocksDB造成了多少痛苦。