首页 文章

Flink State后端密钥atomicy和distribution

提问于
浏览
0

在阅读了flink文档后,(下面提到的相关部分)我仍然没有完全理解原子性和密钥分发 .

即考虑一个由keyby-> flatmap(包含一个map状态)组成的图形,并行设置为1,有4个任务槽,flink确保每个密钥在分布式环境中只存在一次(在一个任务槽中),并且是原子单位?提前感谢所有帮助者 .

您可以将键控状态视为已分区或分片的操作员状态,每个键只有一个状态分区 . 每个键控状态在逻辑上绑定到<parallel-operator-instance,key>的唯一复合,并且由于每个键“属于”一个键控运算符的一个并行实例,我们可以将其简单地视为<operator,key > . 键控状态进一步组织成所谓的密钥组 . 密钥组是Flink可以重新分配密钥状态的原子单元;密钥组与定义的最大并行度完全一样多 . 在执行期间,键控运算符的每个并行实例都使用一个或多个密钥组的密钥 .

1 回答

  • 2

    对于任何给定的并行运算符,具有相同密钥的所有事件由相同的运算符实例处理 - 即,在相同的任务时隙中 .

    Flink将密钥组织到密钥组中,并且每个密钥(及其状态)与特定密钥组永久关联 . 此外,每个任务槽负责处理一个或多个密钥组的密钥 .

    您引用的文档使用短语“原子单位”来表示“不可分割”,这在考虑重新调整Flink作业时(即,并行性发生变化时)会发生什么时变得相关 .

    重新调整Flink作业时,并行运算符的实例数将发生变化,这需要重新分配状态 . 完成状态重新分配(或重新分配)的粒度不是密钥,而是更大 - 它是在密钥组级别完成的 . 因此,关键组是重新分配键控状态的原子单元 .

    有关此主题的更多信息,请参阅the section of a data Artisans blog post about "State in Flink and Rescaling Stateful Streaming Jobs" .

相关问题