Flink keyedBy是逻辑分区,而partitionCustom是物理分区

mspsb9vt  于 2023-03-06  发布在  Apache
关注(0)|答案(1)|浏览(287)

我正在www.example.com上阅读https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/dev/datastream/operators/overview/#keyby
上面写着:
将流逻辑分区为不相交的分区。所有具有相同键的记录都分配到相同的分区。内部,keyBy()是通过哈希分区实现的。
logically在这里是什么意思?我认为它们是物理分区的。
Source->keyBy->Process为例
SourceFunction.setParallism(2).keyBy(._id).process(ProcessFunction).setParallism(3)
流程操作员有3个子任务,那么源中的数据将根据其id路由到流程操作员的相应分区(数据 Shuffle )?
keyBypartitionCustom有什么区别吗(说是物理分区),都涉及到shuffle。

0mkxixxg

0mkxixxg1#

你是对的,最终.keyBy()必须根据键来决定TM中的哪个槽将接收给定的记录。不同之处在于.key()首先要经过一个“逻辑分区”,每个键被分配到一个键组索引,这不依赖于下游操作符的特定并行度,只依赖于你为作业设置的最大并行度。
然后,键组索引被Map到一个“操作符索引”(又名子任务索引),该索引然后被Map到任务管理器上的一个槽。
当你执行.partitionCustom()时,你可以控制从键计算出来的操作符索引,但是因为你没有基于键组来建立索引,所以你不会得到KeyedStream,因此你没有键控状态/计时器。

相关问题