2017-08-17 39 views
0

在阅读flink文档(相关部分在下面注明)之后,我仍然没有完全理解原子性和密钥分布。Flink状态后端键atomicy和分配

即考虑由keyby-> flatmap(含有映射的状态)的设置为1与4个任务槽的曲线图,和平行度,并确保弗林克每个键只存在一次(在一个任务时隙)在分布式环境中,它是原子单位吗? 在此先感谢所有帮手。

您可以将键控状态视为操作员状态,该状态已被分区或分区,每个键只有一个状态分区。每个键控状态都逻辑上绑定到一个唯一的组合<parallel-operator-instance, key>,并且由于每个键“属于”一个键控运算符的并行实例,我们可以简单地将其想象为<operator, key>

键控状态被进一步组织成所谓的密钥组。密钥组是Flink可以重新分配键控状态的原子单位;有确定的最大并行度的密钥组数量完全相同。在执行过程中,键控操作符的每个并行实例都与一个或多个键组的键一起工作。

回答

2

对于任何给定的并行运算符,具有相同键的所有事件都由相同的运算符实例处理 - 即在同一个任务槽中。

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

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

当Flink作业重新调整大小时,并行运算符的实例数量将发生变化,这需要重新分配状态。状态重新分配(或重新分配)的粒度不是按键的关键,而是更大 - 它是在关键组的级别完成的。因此,密钥组是重新分配键控状态的原子单位。请参阅the section of a data Artisans blog post about "State in Flink and Rescaling Stateful Streaming Jobs"

+0

真棒,这清除它。非常感激。 – Eliran