flink如何使用多个分区的kafka主题中的消息,而不会产生偏差?

arknldoa  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(442)

假设一个主题有3个kafka分区,我希望我的事件按小时显示,使用事件时间。
当分区在当前窗口之外时,kafka使用者是否会停止从分区读取数据?还是打开了一扇新Windows?如果它正在打开新的窗口,那么,如果一个分区的事件时间与其他分区的事件时间相比非常倾斜,那么理论上不可能让它打开无限数量的窗口,从而耗尽内存吗?当我们重演一些历史时,这种情况尤其可能发生。
我一直试图从阅读文档中得到这个答案,但是找不到关于flink和kafka分区的很多内部内容。关于这个特定主题的一些好的文档将是非常受欢迎的。
谢谢!

6jjcrrmo

6jjcrrmo1#

你可以试着用这种风格

public void runStartFromLatestOffsets() throws Exception {
        // 50 records written to each of 3 partitions before launching a latest-starting consuming job
        final int parallelism = 3;
        final int recordsInEachPartition = 50;

        // each partition will be written an extra 200 records
        final int extraRecordsInEachPartition = 200;

        // all already existing data in the topic, before the consuming topology has started, should be ignored
        final String topicName = writeSequence("testStartFromLatestOffsetsTopic", recordsInEachPartition, parallelism, 1);

        // the committed offsets should be ignored
        KafkaTestEnvironment.KafkaOffsetHandler kafkaOffsetHandler = kafkaServer.createOffsetHandler();
        kafkaOffsetHandler.setCommittedOffset(topicName, 0, 23);
        kafkaOffsetHandler.setCommittedOffset(topicName, 1, 31);
kafkaOffsetHandler.setCommittedOffset(topicName, 2, 43);
crcmnpdw

crcmnpdw2#

因此,首先,Kafka的所有事件都是不断读取的,进一步的窗口操作不会对其产生影响。当谈到内存不足时,有更多的事情要考虑。
通常情况下,并不是为一个窗口存储每个事件,而是为该事件存储一些聚合
每当窗口关闭时,相应的内存就会被释放。
更多关于kafka消费者如何与eventtime交互的信息(您可以在此处查看水印)

相关问题