在flink中的链式操作员中分配负载



我有一个带有单个碎片的输入驱魔流。我创建了一个简单的应用程序,它带有map函数,但环境级别的并行度为8。使用线程探查器,当我检查创建的线程时,只有1个线程对映射函数和源处于活动状态(如文档中所述的查询(。我意识到这是因为我在环境层面上设置了并行性。在map函数被消耗后,是否有办法将负载分配到为其创建的所有并行实例中?

一个简单的解决方案是将rebalance()放在驱动蛋白消费者的后面。rebalance()进行往返重新分区。这将在随后的映射的8个实例中重新分配从一个碎片读取的事件

文件。

重新平衡将导致ser/de和网络洗牌。您必须权衡拥有8个而不是一个活动管道的好处。

假设你的工作图看起来像这样,

source -> map -> async -> filter -> keyBy + process function -> sink

稍后在管道中的keyBy将导致另一个网络洗牌。如果你非常关心性能,你可能可以在源之后立即执行keyBy(而不是在那里使用再平衡(,然后在异步操作符之后使用repretAsKeyedStream,以避免第二次网络洗牌。这变得有点复杂的原因是异步运算符对键控流一无所知——只有在异步函数前后使用相同的KeySelector才有意义的情况下,这才会起作用。

相关内容

  • 没有找到相关文章

最新更新