首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache Flink -如何对齐Flink和Kafka切分

Apache Flink -如何对齐Flink和Kafka切分
EN

Stack Overflow用户
提问于 2022-08-08 13:47:13
回答 1查看 117关注 0票数 2

我正在为一个大容量流用例(每秒数以千万计的事件)开发一个DataStream-based Flink应用程序。这些数据是从卡夫卡主题中消耗的,并且已经根据特定的键进行了切分。我的意图是在Flink端创建特定于键的状态,以运行自定义分析。我无法解决的主要问题是,如何创建键控状态,而不对keyBy()强加的传入数据进行重新配置。

我可以保证Flink作业的最大并行性将小于或等于源Kafka主题中的分区数,因此逻辑上没有必要进行洗牌。this StackOverflow问题的答案表明,可能有可能以一种符合Flink预期的方式将数据写入Kafka,然后使用reinterpretAsKeyedStream()。我很乐意为这个申请做这件事。有人能分享必要的步骤吗?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-09 18:18:55

您需要做的是确保将每个事件写入Kafka分区,该分区将被分配给该事件的键所在的同一个任务槽读取。

下面是你需要知道的东西,才能让它发挥作用:

(1) Kafka分区以循环方式分配给任务槽:分区0被分配到槽0,分区1到槽1,等等,如果有更多的分区而不是槽,则回缩到槽0。

(2)将密钥映射到密钥组,将密钥组分配给时隙。密钥组的数量由最大并行性(这是配置参数;缺省值为128)决定。

密钥的密钥组是通过

代码语言:javascript
复制
keygroupId = MathUtils.murmurHash(key.hashCode()) % maxParallelism

然后,根据

代码语言:javascript
复制
slotIndex = keygroupId * actualParallelism / maxParallelism

(3)然后,您需要使用DataStreamUtils.reinterpretAsKeyedStream来获取Flink,将预分区的流视为键控流。

采用这种方法的一个效果是,如果您需要更改并行性,这将是痛苦的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73278930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档