Apache Flink中的Keyby数据分布是逻辑操作员还是物理操作员?

问题描述

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

KeyBy是否100%进行逻辑转换?它不包括用于在群集节点之间分布的物理数据分区吗?如果是这样,那么如何保证所有具有相同键的记录都分配给同一分区?

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

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

解决方法

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

每个密钥恰好属于一个密钥组。启动集群时,会为每个任务管理器分配一些特定的密钥组-如果从检查点或保存点启动集群,则按快照组对这些快照进行索引,并且每个任务管理器会在密钥中加载密钥的状态分组。

在运行作业时,每个任务管理器都知道用于计算键的键选择器功能,以及键如何映射到键组上。 TM还知道将密钥组分配给任务管理器。这样可以很容易地将每条消息路由到负责该消息密钥的任务管理器。