在阅读了flink文档后,(下面提到的相关部分)我仍然没有完全理解原子性和密钥分发。
即考虑由keyby-> flatmap(包含地图状态)组成的图形,并将并行性设置为1,具有4个任务槽,flink确保每个密钥在分布式环境中仅存在一次(在一个任务槽中) ,它是原子单位吗? 提前感谢所有帮助者。
您可以将Keyed State视为已分区或分片的运营商状态,每个密钥只有一个状态分区。每个键控状态在逻辑上绑定到
<parallel-operator-instance, key>
的唯一复合,并且由于每个键“属于”键控运算符的一个并行实例,因此我们可以将其简单地视为<operator, key>
。键控状态进一步组织成所谓的密钥组。密钥组是Flink可以重新分配密钥状态的原子单元;密钥组与定义的最大并行度完全一样多。在执行期间,键控运算符的每个并行实例都使用一个或多个密钥组的密钥。
答案 0 :(得分:2)
对于任何给定的并行运算符,具有相同键的所有事件都由同一个运算符实例处理 - 即,在同一任务槽中。
Flink将密钥组织到密钥组中,并且每个密钥(及其状态)与特定密钥组永久关联。此外,每个任务槽负责处理一个或多个密钥组的密钥。
您引用的文档使用短语&#34;原子单位&#34;意味着&#34;不可分割&#34;,当考虑重新调整Flink作业时(即,并行性发生变化时)会发生什么,这就变得相关。
重新调整Flink作业时,并行运算符的实例数将发生变化,这需要重新分配状态。完成状态重新分配(或重新分配)的粒度不是按键密钥,而是更大 - 它是在密钥组级别完成的。因此,关键组是重新分配键控状态的原子单元。
有关此主题的更多信息,请参阅the section of a data Artisans blog post about "State in Flink and Rescaling Stateful Streaming Jobs"。