Flink 中的缓存位置

Cache locality in Flink

我有一个包含密钥的数据流,我需要将其与与该密钥关联的数据混合和匹配。每个键属于一个分区,每个分区可以从数据库中加载。

数据很大,一个任务管理器只能容纳几十万个分区中的几百个。

我现在的做法是在key.partition的基础上使用partitionCustom,把分区数据缓存在一个RichMapFunction里面,这样就可以混搭了,不用多次重新加载分区的数据。

当同一分区上的消息速率过高时,我遇到了 hot-spot/performance 瓶颈。

我在Flink中有什么工具可以提高这种情况下的吞吐量?

有没有办法根据机器上的设置时间和最大处理时间历史记录来自定义调度和优化作业布置?

这听起来像是 (a) 您的基于数据库的数据也被分区了,并且 (b) 您的密钥有偏差,其中一个分区比其他分区获得更多的密钥。

假设以上是正确的,并且您已经对 "mix and match" 代码进行了代码分析以使其相当高效,那么您就剩下手动优化了。例如,如果您知道分区 X 中的密钥更为常见,则可以将所有这些密钥放在一个分区中,然后将剩余的密钥分布到其他分区中。

另一种方法是添加一个 "batcher" 运算符,它将同一分区的最多 N 个键放入一个组中(通常这也需要超时才能刷新,因此数据不会卡住)。如果您可以批量处理足够多的密钥,那么为与每批密钥关联的分区按需加载数据库数据可能不会那么糟糕。