我尝试了一个小实验,我想知道如何解释我所看到的。目的 该实验的目的是试图了解Kafka Streams如何进行多线程处理。一世 使用三个分区创建并填充输入主题。然后我创建了一个Streams图 包括以下内容,并将其配置为使用三个线程运行。
kstream = kstream.mapValues(tsdb_object -> {
System.out.println( "mapValues: Thread " + Thread.currentThread().getId());
return tsdb_object;
});
// Add operator to print results to stdout:
Printed<Long, TsdbObject> printed = Printed.toSysOut();
kstream.print(printed);
KGroupedStream<Long, TsdbObject> kstream_grouped_by_key = kstream.groupByKey(Serialized.with(Serdes.Long(), TsdbObject.getSerde()));
KTable<Long, TsdbObject> summation =
kstream_grouped_by_key.reduce((tsdb_object1, tsdb_object2) -> {
System.out.println("reducer: Thread " + Thread.currentThread().getId());
return tsdb_object1;
});
我认为第一个print语句会打印出三个不同的消息 线程ID,这就是发生的事情。但是,我认为第二次打印 声明,在聚合(缩减器)操作的中间发出,会 打印出消息列出只有一个线程ID,假设减少 不会是多线程的。事实证明并非如此:第二次印刷 生成的消息列出了三个不同的线程ID。
有人可以简要解释聚合(缩减器)的运行方式 三个不同的线程?它们是否并行运行?
答案 0 :(得分:1)
是的,聚合也是用3个线程执行的,每个线程对所有键的1/3进行聚合。
为什么你会认为聚合不是多线程的?请注意,它是一个聚合每个键,因此每个键的结果与所有其他键的结果无关。这允许并行化计算。