Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在平面图之后具体化卡夫卡流_Java_Apache Kafka_Apache Kafka Streams_Spring Kafka - Fatal编程技术网

Java 在平面图之后具体化卡夫卡流

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

我想使用Spring Kafka支持的两个Kafka主题和Kafka流。 这些主题具有不同的键和值。我想映射第二个主题中的键和值,并通过以下方法将其与第一个主题进行合并:
.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
实例,还可以防止发生多个重新分区的可能性

嗯,


比尔

谢谢!此外,通过测试此流,我在中发现了第二个问题:谢谢!此外,通过测试此流,我观察到了中的第二个问题: