Apache Flink 中的 Keyby 数据分布,逻辑运算符还是物理运算符?

2023-12-12

根据 Apache Flink 文档,KeyBy 转换在逻辑上将流划分为不相交的分区。所有具有相同键的记录都被分配到同一个分区。

KeyBy是100%逻辑转换吗?它不包括跨集群节点分布的物理数据分区吗?如果是这样,那么如何保证所有具有相同键的记录都分配到同一个分区呢?

例如,假设我们从 n 个节点的 Apache Kafka 集群获取分布式数据流。运行我们的流作业的 Apache Flink 集群由 m 个节点组成。当对传入数据流应用 keyBy 转换时,它如何保证逻辑数据分区?或者它是否涉及跨集群节点的物理数据分区?

我似乎对逻辑数据分区和物理数据分区感到困惑。


所有可能的键的键空间被划分为一定数量的关键群体。密钥组的数量(与最大并行度) 是您在设置 Flink 集群时可以设置的配置参数;默认值为 128。

每个密钥都属于一个密钥组。当集群启动时,键组在任务管理器之间划分——如果集群是从检查点或保存点启动的,这些快照将按键组索引,每个任务管理器会加载键中键的状态已分配的组。

当作业运行时,每个任务管理器都知道用于计算键的键选择器函数,以及键如何映射到键组。 TM 还知道任务管理器的关键组划分。这使得将每条消息路由到负责该消息密钥的任务管理器变得简单。

Details:

密钥所属的密钥组的计算大致如下:

Object key = the result of your KeySelector function;
int keyHash = key.hashCode();
int keyGroupId = MathUtils.murmurHash(keyHash) % maxParallelism;

在给定实际并行度和 maxParallelism 的情况下,应将给定键组中的元素路由到的运算符实例的索引,计算如下

keyGroupId * parallelism / maxParallelism

实际代码在org.apache.flink.runtime.state.KeyGroupRangeAssignment如果你想看一下。

一个主要结论是密钥组是不相交的,并且它们跨越密钥空间。换句话说,不可能出现不属于某个密钥组的密钥。每个密钥都属于一个密钥组,并且每个密钥组都属于一个 的任务管理器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Flink 中的 Keyby 数据分布,逻辑运算符还是物理运算符? 的相关文章

随机推荐