我正在学习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();
}
}