繁体   English   中英

Flink如何使用来自具有多个分区的Kafka主题的消息而不会产生偏差?

[英]How does Flink consume messages from a Kafka topic with multiple partitions, without getting skewed?

假设我们为一个主题有3个kafka分区,我希望使用事件时间按小时对事件进行窗口显示。

kafka用户在当前窗口之外时会停止从分区读取吗? 还是打开一个新窗口? 如果要打开新窗口,那么从理论上讲,如果一个分区的事件时间比其他分区的事件时间大不相同,那么打开一个无限数量的窗口,从而耗尽内存是不可能的吗? 当我们重播一些历史记录时,这种情况尤其可能发生。

我一直在尝试从阅读文档中获得此答案,但是在分区上找不到有关Kafka的Flink内部的更多信息。 非常欢迎您提供有关此特定主题的一些好的文档。

谢谢!

您可以尝试使用这种类型的样式

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);

因此,首先会不断读取来自Kafka的事件,并且进一步的窗口操作对此没有影响。 在谈论内存不足时,还有更多要考虑的事情。

  • 通常,您不存储窗口的每个事件,而仅存储事件的一些汇总
  • 每当关闭窗口时,就会释放相应的内存。

有关Kafka使用者如何与EventTime交互的更多信息(尤其是水印,您可以在此处查看

也许这会帮助您弄清楚

https://github.com/apache/flink/blob/release-1.2/flink-connectors/flink-connector-kafka-base/src/main/java/org/apache/flink/streaming/connectors/kafka/partitioner/ FixedPartitioner.java

一个分区程序,用于确保每个内部Flink分区最终位于一个Kafka分区中。

尽管有完整的注释部分。他们也解释了各种情况。

暂无
暂无

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

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