Java 在平面图之后具体化卡夫卡流
我想使用Spring Kafka支持的两个Kafka主题和Kafka流。 这些主题具有不同的键和值。我想映射第二个主题中的键和值,并通过以下方法将其与第一个主题进行合并:Java 在平面图之后具体化卡夫卡流,java,apache-kafka,apache-kafka-streams,spring-kafka,Java,Apache Kafka,Apache Kafka Streams,Spring Kafka,我想使用Spring Kafka支持的两个Kafka主题和Kafka流。 这些主题具有不同的键和值。我想映射第二个主题中的键和值,并通过以下方法将其与第一个主题进行合并:.merge(KStream otherStream) 以下是一个例子: // Block 1 KStream<MyKey, MyValue> stream2 = streamsBuilder.stream( "second-topic", consumedAs(Oth
.merge(KStream otherStream)
以下是一个例子:
// Block 1
KStream<MyKey, MyValue> stream2 = streamsBuilder.stream(
"second-topic",
consumedAs(OtherKey.class, OtherValue.class, AllowEmpty.NONE) // Provides default json Serde
).flatMap(
(key, value) -> {
List<KeyValue<MyKey, MyValue>> list = new ArrayList<>();
// Do stuff an fill out the list
return list;
});
// Block 2
KStream<MyKey, MyValue>[] branches = stream
.merge(stream2)
... business stuff
//块1
KStream stream2=streamsBuilder.stream(
“第二个主题”,
consumedAs(OtherKey.class、OtherValue.class、AllowEmpty.NONE)//提供默认json Serde
).平面图(
(键、值)->{
列表=新的ArrayList();
//填一张清单
退货清单;
});
//第2区
KStream[]分支=流
.merge(stream2)
... 业务人员
通过这个解决方案,我得到了一个ClassCastException
,原因是MyKey
不能转换为MyKey
。原因是,它们由不同的模块和类装入器提供。错误发生在序列化中的合并块中。通过transform(…)
我得到了相同的行为。
如果我通过(“tmp主题”)添加命令。
,一切正常。主题的物化返回一个有效的可序列化对象,而不是flatMap(…)
我在groupByKey
中找到了以下API文档:
。。。
如果在此操作之前使用了密钥更改操作符(例如,selectKey(KeyValueMapper)、map(KeyValueMapper)、flatMap(KeyValueMapper)或transform(TransformerSupplier,String…),并且之后没有发生数据重新分配(例如,通过(String))时,将在Kafka中创建内部重新分区主题。此主题将命名为“${applicationId}-XXX重新分区”,其中“applicationId”是用户通过参数APPLICATION_ID_CONFIG在StreamsConfig中指定的,“XXX”是内部生成的名称,“-repartition”是固定后缀。您可以通过Topology.Descripte()检索所有生成的内部主题名称。
在这种情况下,此流的所有数据都将通过重新分区主题进行重新分配,方法是将所有记录写入该主题,然后从中重新读取所有记录,以便生成的KGroupedStream在其键上正确分区
正如您所看到的,似乎更改操作(如flatMap(…)
后的最佳实践是将其写入主题,因为序列化和重新分区
您如何看待使用通过(“主题”)
使其工作?
有没有人知道,如果在flatMap(…)
之后不写主题,是否有可能实现
版本春季卡夫卡版本:2.2.5.发布
Apache Kafka客户端:2.0.1
Apache Kafka Streams:2.0.1仅在某些上下文中,每当您使用密钥更改操作时,任何使用新密钥的下游处理器都会触发重新分区主题的创建。重新分区主题确保新密钥位于正确的分区上。我知道你可能已经知道这一点,但我只是在这里重申这一点,以便澄清 考虑到这一点,在修改密钥后执行
到()
操作是完全可以接受的,因为卡夫卡流在封面下也会这样做
因此,通过(someTopic)使用flatMap(…)很好
此外,通过这样做,如果在下游的其他操作(联接、聚合)中使用带有修改键的KStream
实例,还可以防止发生多个重新分区的可能性
嗯,
Bill仅在某些上下文中,每当您使用密钥更改操作时,任何使用新密钥的下游处理器都会触发重新分区主题的创建。重新分区主题确保新密钥位于正确的分区上。我知道你可能已经知道这一点,但我只是在这里重申这一点,以便澄清
考虑到这一点,在修改密钥后执行到()
操作是完全可以接受的,因为卡夫卡流在封面下也会这样做
因此,通过(someTopic)使用flatMap(…)很好
此外,通过这样做,如果在下游的其他操作(联接、聚合)中使用带有修改键的KStream
实例,还可以防止发生多个重新分区的可能性
嗯,
比尔谢谢!此外,通过测试此流,我在中发现了第二个问题:谢谢!此外,通过测试此流,我观察到了中的第二个问题: