IntervalJoin 在 flink-1.6.2 卡在 rocksdb'seek 时间过长

IntervalJoin is stucked in rocksdb'seek for too long time in flink-1.6.2

我正在使用 IntervalJoin 函数在 10 分钟内加入两个流。如下:

labelStream.intervalJoin(adLogStream)
           .between(Time.milliseconds(0), Time.milliseconds(600000))
           .process(new processFunction())
           .sink(kafkaProducer)

labelStream 和 adLogStream 是 proto-buf class,由 Long id 键控。

我们的两个输入流很大。 运行 大约 30 分钟后,向 kafka 的输出缓慢下降,如下所示:

当数据输出开始下降时,我多次使用 jstack 和 pstack 来获取这些数据:

程序好像卡在了rockdb的seek中。而且我发现有些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.

谁能给我一些建议?非常感谢。

一些想法:

  • 你可以在 flink-user 邮件列表上提问——一般来说,像这样的操作问题在邮件列表上比在堆栈溢出上更有可能引起知识渊博的回答。

  • 我听说如果为 RocksDB 提供更多的堆外内存来使用,它会有所帮助,因为 RocksDB 将使用它进行缓存。抱歉,但我不知道如何进行配置的任何细节。

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

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