Parallel processing 为什么不能在不丢失状态的情况下更新flink作业的maxparallelism?

Parallel processing 为什么不能在不丢失状态的情况下更新flink作业的maxparallelism?,parallel-processing,apache-flink,flink-streaming,Parallel Processing,Apache Flink,Flink Streaming,我刚刚读到Flink作业的最大并行度(由setMaxParallelism定义)不能在不丢失状态的情况下更改。这让我有点吃惊,不难想象这样一种场景:一个人开始运行一个作业,却发现负载最终比预期的要大10倍(或者代码的效率低于预期),从而产生了提高并行性的愿望 我找不到很多原因,除了提到一些关键群体。我发现的最具体的陈述是: 缩放作业时,最大并行度不得更改,因为它会破坏键到键组的映射 然而,这仍然给我留下了一些问题: 为什么很难/不可能让工作改变其最大平行度? 基于上述情况,我们想到了以下概念性

我刚刚读到Flink作业的最大并行度(由setMaxParallelism定义)不能在不丢失状态的情况下更改。这让我有点吃惊,不难想象这样一种场景:一个人开始运行一个作业,却发现负载最终比预期的要大10倍(或者代码的效率低于预期),从而产生了提高并行性的愿望

我找不到很多原因,除了提到一些关键群体。我发现的最具体的陈述是:

缩放作业时,最大并行度不得更改,因为它会破坏键到键组的映射

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

为什么很难/不可能让工作改变其最大平行度?
基于上述情况,我们想到了以下概念性解决方案:

  • 在状态中,跟踪上次使用的最大并行度
  • 启动作业时,指示所需的最大并行度
  • 鉴于这两种设置都是已知的,因此应该可以推断映射需要如何更改才能在最初保持有效
  • 如果需要,可以使用新的maxparallelism基于旧状态定义新状态,以“适应”新作业

  • 我并不是说这个概念上的解决方案是理想的,也不是说实现起来很简单。我只是想知道最大并行性的严格本质是否有更多的原因。并试图了解这是否只是“这种灵活性尚未实现”或“这与Flink的本质背道而驰,人们不应该想要它”的问题。

    通过计算密钥的哈希值,将每个密钥分配给一个密钥组。因此,更改键组的数量会影响将键分配给键组。每个任务管理器负责一个或多个密钥组,因此密钥组的数量与最大并行性相同

    更改此数字令人痛苦的原因是,它被有效地烘焙到状态快照(检查点和保存点)中。这些快照按密钥组编制索引,以便在系统启动时,每个任务管理器可以有效地加载它们所需的状态

    内存中的数据结构会随着密钥组数量的增加而显著增大,这就是为什么max parallelism不会默认为某个较大的值(默认值为128)


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

    因此,假设您希望更改最大并行度。我是否正确解释了一个可以创建保存点、使用状态处理API更新它以更改最大并行度并从那里继续的方法?(可能需要一些停工或赶工)?是的,这是理论。目前,状态处理器API有点不完整,缺乏对窗口状态的支持。