翻滚窗口概念卡夫卡流

时间:2017-08-30 09:07:50

标签: apache-kafka apache-kafka-streams

我正在学习kafka流中的翻滚窗口概念。因此,基于https://github.com/timothyrenner/kafka-streams-ex/tree/master/tumbling-window中提到的代码,我创建了我的jar并在我的Linux VM上运行它们(即生产者和消费者代码都在我的VM上运行)。我在这里有一个问题(我的理解可能不正确)。所以,当我在主题longs(生产者正在生成数据)和long-counts-all(最终输出由kafka流代码呈现)上运行kafka-console-consumer时,我看到每6个(k,v)在主题long上产生的记录,3(k,v)记录输出到long-count-all(输出主题)。例如:

longs:

A       -3
A       2
A       1
A       -7
A       -1

A       1

long-counts-all:

A       2
A       2
A       2

我有两个问题:

1)虽然我的翻滚时间是TimeWindows.of(1000L),但是我无法理解为什么每30秒时间框架上主题 - long-counts-all产生'A'的计数的原因,而它应该已经持续了10秒钟。

2)另外,我猜测密钥'A'的计数是每10秒2,这就是为什么主题 - long-counts-all中的输出是'A 2'的原因。如果有任何错误,请纠正我。

制片:

public class Producer {
    public static void main(String[] args) {
        // Now generate the data and write to the topic.
        Properties producerConfig = new Properties();
        producerConfig.put("bootstrap.servers", "localhost:9092");
        producerConfig.put("key.serializer",
                "org.apache.kafka.common" +
                        ".serialization.ByteArraySerializer");
        producerConfig.put("value.serializer",
                "org.apache.kafka.common" +
                        ".serialization.LongSerializer");

        KafkaProducer producer =
                new KafkaProducer<byte[], Long>(producerConfig);

        Random rng = new Random(12345L);
        try {
            while (true) {
                producer.send(new ProducerRecord<byte[], Long>(
                        "longs", "A".getBytes(), rng.nextLong() % 10));
                Thread.sleep(5000L);
            }
        } catch(Exception e)   {
            e.printStackTrace();
        }
    }
}

消费者:

public class Consumer {
    public static void main(String[] args) {
        Properties config = new Properties();

        config.put(StreamsConfig.APPLICATION_ID_CONFIG,
                "tumbling-window-kafka-streams");
        config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,
                "localhost:9092");
        config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG,
                Serdes.ByteArray().getClass().getName());
        config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG,
                Serdes.Long().getClass().getName());

        KStreamBuilder builder = new KStreamBuilder();

        KStream<byte[], Long> longs = builder.stream(
                Serdes.ByteArray(), Serdes.Long(), "longs");

        // The tumbling windows will clear every ten seconds.
        KTable<Windowed<byte[]>, Long> longCounts =
                longs.groupByKey()
                        .count(TimeWindows.of(10000L)
                                        .until(10000L),
                                "long-counts");

        // Write to topics.
        longCounts.toStream((k,v) -> k.key())
                .to(Serdes.ByteArray(),
                        Serdes.Long(),
                        "long-counts-all");

        KafkaStreams streams = new KafkaStreams(builder, config);
        streams.start();
    }
}   

0 个答案:

没有答案