繁体   English   中英

Apache Flink - 如何对齐 Flink 和 Kafka 分片

[英]Apache Flink - how to align Flink and Kafka sharding

我正在为大容量流用例(每秒数千万个事件)开发基于DataStream的 Flink 应用程序。 数据是从 Kafka 主题中消费的,并且已经根据某个 key 进行了分片。 我的目的是在 Flink 端创建特定于键的状态来运行自定义分析。 我无法解决的主要问题是如何创建键控状态而不重新洗牌由keyBy()施加的传入数据。

我可以保证 Flink 作业的最大并行度会小于或等于源 Kafka 主题中的分区数,所以逻辑上不需要 shuffle。 这个StackOverflow 问题的答案表明,有可能以与 Flink 的期望兼容的方式将数据写入 Kafka,然后使用reinterpretAsKeyedStream() 我很乐意为这个应用程序做这件事。 有人可以分享必要的步骤吗?

先感谢您。

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

以下是您需要了解的内容:

(1) Kafka 分区以循环方式分配给任务槽:分区 0 到槽 0,分区 1 到槽 1,依此类推,如果分区多于槽,则回绕到槽 0。

(2) 键映射到键组,键组分配到槽。 密钥组的数量由最大并行度决定(这是一个配置参数;默认值为 128)。

密钥的密钥组通过以下方式计算

keygroupId = MathUtils.murmurHash(key.hashCode()) % maxParallelism

然后根据

slotIndex = keygroupId * actualParallelism / maxParallelism

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM