[英]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.