parallel-processing - 为什么 flink 作业的 maxparallelism 不能在不丢失状态的情况下更新?
问题描述
我刚刚读到 Flink 作业的最大并行度(由 setMaxParallelism 定义)不能在不丢失状态的情况下更改。这让我有点吃惊,不难想象一个人开始运行作业,却发现负载最终比预期大 10 倍(或者代码的效率低于预期)导致增加并行度的愿望。
除了对关键组的一些引用之外,我找不到很多原因。我在这里找到的最有形的陈述:
扩展作业时最大并行度不得更改,因为它会破坏键到键组的映射。
但是,这仍然给我留下了一些问题:
为什么让工作改变其最大并行度很难/不可能?
基于上述,我想到了以下概念性解决方案:
- 在状态中,跟踪上次使用的最大并行度
- 开始作业时,指示所需的最大并行度
- 鉴于这两个设置都是已知的,应该可以推断出映射需要如何更改才能保持初始有效。
- 如果需要,可以基于具有新最大并行度的旧状态定义新状态,以“适应”新工作。
我并不是说这个概念性解决方案是理想的,或者实施起来很简单。我只是想知道最大并行度的非常严格的性质是否还有更多。并试图理解这是否只是“这种灵活性尚未实现”或“这与 Flink 的本质背道而驰,以至于人们不应该想要它”的问题。
解决方案
通过以密钥组的数量为模计算密钥的哈希值,将每个密钥准确地分配给一个密钥组。因此,更改键组的数量会影响键组的键分配。每个任务管理器负责一个或多个键组,因此键组的数量与最大并行度相同。
这个数字很难更改的原因是它有效地融入了状态快照(检查点和保存点)。这些快照由键组索引,因此在系统启动时,每个任务管理器都可以有效地加载它们需要的状态。
随着键组数量的增加,内存中的数据结构会显着扩展,这就是为什么最大并行度不会默认为某个相当大的值(默认值为 128)。
如果您需要更改密钥组的数量或在状态后端之间迁移,状态处理器 API可用于重写状态快照。
推荐阅读
- python - 定义名称时 Python3 中的名称错误
- powershell-3.0 - PowerShell 变量到 SMTP 电子邮件
- java - 在 Java/Python 中生成时间序列数据
- protractor - Cucumber 无法从数据表中分离出两个不同的字符串
- wordpress - Woocommerce中按特定产品属性值过滤的产品
- javascript - Moment.js - 营业/营业/轮班时间内的持续时间?
- amazon-s3 - PDI 8.0 S3 CSV 输入
- css - Bootstrap 3 中的 CSS 如何导致断点 xs 从垂直堆叠的 div 开始?
- amazon-web-services - AWS - 管理 EC2 用户会话
- php - XAMPP 访问被禁止