IntervalJoin在flink-1.6.2中

时间:2018-11-20 13:12:19

标签: apache-flink rocksdb

我正在使用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的输出缓慢下降,如下所示: enter image description here

当数据输出开始下降时,我使用jstack和pstack sevaral时间来获取这些信息: enter image description here enter image description here

该程序似乎卡在了rockdb的搜索中。而且我发现某些rockdb的srt文件是通过迭代缓慢访问的。 enter image description here

我尝试了几种方法:

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.

有人可以给我一些建议吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

一些想法:

  • 您可以在flink用户邮件列表中询问-通常,与栈溢出相比,此类操作问题更有可能在邮件列表上引起有知识的响应。

  • 我听说,如果RocksDB可以使用更多的堆外内存,则可以提供帮助,因为RocksDB会将其用于缓存。抱歉,但是我不知道如何配置它的任何详细信息。

  • 也许增加并行度会有所帮助。

  • 如果有可能,尝试使用基于堆的状态后端运行可能会很有趣,只是看看RocksDB造成了多少痛苦。