为什么一个flink job的maxparallelism不能更新而不丢失状态?

Why can the maxparallelism of a flink job not be updated without losing state?

我刚读到 Flink 作业的最大并行度(由 setMaxParallelism 定义)不能在不丢失状态的情况下更改。这让我有点吃惊,不难想象开始 运行 一项工作的场景,却发现负载最终比预期大 10 倍(或者代码的效率低于预期) ) 导致希望增加并行性。

除了对关键组的一些引用之外,我找不到很多原因。我找到的最有形的说法 here:

The max parallelism mustn't change when scaling the job, because it would destroy the mapping of keys to key groups.

然而,这仍然给我留下了问题:

为什么要hard/impossible让作业改变其最大并行度?


基于以上,我想到了以下概念性解决方案:

  1. 在该状态下,跟踪最后使用的最大并行度
  2. 开始作业时,指明所需的最大并行度
  3. 鉴于这两个设置都是已知的,应该可以推断出映射最初需要如何更改才能保持有效。
  4. 如果需要,可以根据具有新最大​​并行度的旧状态定义新状态,'fit' 新作业。

我并不是说这个概念性解决方案是理想的,或者实施起来很简单。我只是想知道最大并行度的非常严格的性质是否还有更多。并试图了解这只是 'this flexibility is not implemented yet' 还是 'this goes so much against the nature of Flink that one should not want it'.

的问题

通过以密钥组的数量为模计算密钥的散列,将每个密钥分配给恰好一个密钥组。因此,更改键组的数量会影响键到键组的分配。每个任务管理器负责一个或多个键组,因此键组的数量与最大并行度相同。

这个数字很难改变的原因是它被有效地烘焙到状态快照(检查点和保存点)中。这些快照按键组索引,因此在系统启动时,每个任务管理器都可以有效地加载它们需要的状态。

内存中的数据结构会随着键组数量的增加而显着增加,这就是为什么最大并行度不会默认为某个相当大的值(默认值为 128)的原因。

如果您需要更改密钥组的数量,或在状态后端之间迁移,State Processor API 可用于重写状态快照。