我正在为一个大容量流用例(每秒数以千万计的事件)开发一个DataStream-based Flink应用程序。这些数据是从卡夫卡主题中消耗的,并且已经根据特定的键进行了切分。我的意图是在Flink端创建特定于键的状态,以运行自定义分析。我无法解决的主要问题是,如何创建键控状态,而不对keyBy()强加的传入数据进行重新配置。
我可以保证Flink作业的最大并行性将小于或等于源Kafka主题中的分区数,因此逻辑上没有必要进行洗牌。this StackOverflow问题的答案表明,可能有可能以一种符合Flink预期的方式将数据写入Kafka,然后使用reinterpretAsKeyedStream()。我很乐意为这个申请做这件事。有人能分享必要的步骤吗?
提前谢谢你。
发布于 2022-08-09 18:18:55
您需要做的是确保将每个事件写入Kafka分区,该分区将被分配给该事件的键所在的同一个任务槽读取。
下面是你需要知道的东西,才能让它发挥作用:
(1) Kafka分区以循环方式分配给任务槽:分区0被分配到槽0,分区1到槽1,等等,如果有更多的分区而不是槽,则回缩到槽0。
(2)将密钥映射到密钥组,将密钥组分配给时隙。密钥组的数量由最大并行性(这是配置参数;缺省值为128)决定。
密钥的密钥组是通过
keygroupId = MathUtils.murmurHash(key.hashCode()) % maxParallelism然后,根据
slotIndex = keygroupId * actualParallelism / maxParallelism(3)然后,您需要使用DataStreamUtils.reinterpretAsKeyedStream来获取Flink,将预分区的流视为键控流。
采用这种方法的一个效果是,如果您需要更改并行性,这将是痛苦的。
https://stackoverflow.com/questions/73278930
复制相似问题