Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Apache kafka 卡夫卡流:将一个主题导入另一个主题_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka 卡夫卡流:将一个主题导入另一个主题

Apache kafka 卡夫卡流:将一个主题导入另一个主题,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我是卡夫卡流的新手,我正在使用它将一个主题精确复制到另一个具有不同名称的主题中。本主题有几个分区,我的制作者使用自定义分区器。使用与输入主题相同数量的分区预先创建输出主题 在我的应用程序中,我做到了(我正在使用Kotlin): val builder=StreamsBuilder() 建设者 .stream(输入) .至(输出) 这是可行的,除了分区(因为我使用的是自定义分区器)。是否有一种简单的方法可以使用输入记录的相同分区将输入记录复制到输出主题 我检查了允许通过ProcessorCont

我是卡夫卡流的新手,我正在使用它将一个主题精确复制到另一个具有不同名称的主题中。本主题有几个分区,我的制作者使用自定义分区器。使用与输入主题相同数量的分区预先创建输出主题

在我的应用程序中,我做到了(我正在使用Kotlin):

val builder=StreamsBuilder()
建设者
.stream(输入)
.至(输出)
这是可行的,除了分区(因为我使用的是自定义分区器)。是否有一种简单的方法可以使用输入记录的相同分区将输入记录复制到输出主题

我检查了允许通过
ProcessorContext
访问输入记录分区的处理器API,但无法手动设置输出记录分区


显然,我可以在接收器中使用自定义分区器,但这意味着使用自定义分区器对记录进行反序列化和序列化,以重新计算输出分区。

首先,根据密钥在分区之间分发消息。具有相似密钥的消息将始终位于同一分区中

因此,如果您的消息有密钥,那么您根本不需要担心它。只要您有与原始主题相同数量的分区;它会被处理好的

第二,如果你将数据复制到另一个主题,那么你应该考虑使用原来的主题。卡夫卡有消费群体的概念

例如,你有一个主题“交易”,然后你可以有消费者群体,即“信用卡处理商”、“抵押贷款支付处理商”、“苹果支付处理商”等等。消费者群体会阅读同一主题,过滤出对他们有意义的事件并进行处理

您还可以创建3个主题并获得相同的结果。尽管如此,这并不是一个最佳的解决方案。您可以在上找到更多信息


首先,消息根据密钥分布在分区之间。具有相似密钥的消息将始终位于同一分区中

因此,如果您的消息有密钥,那么您根本不需要担心它。只要您有与原始主题相同数量的分区;它会被处理好的

第二,如果你将数据复制到另一个主题,那么你应该考虑使用原来的主题。卡夫卡有消费群体的概念

例如,你有一个主题“交易”,然后你可以有消费者群体,即“信用卡处理商”、“抵押贷款支付处理商”、“苹果支付处理商”等等。消费者群体会阅读同一主题,过滤出对他们有意义的事件并进行处理

您还可以创建3个主题并获得相同的结果。尽管如此,这并不是一个最佳的解决方案。您可以在上找到更多信息

生成的
(这是
KStream::to
参数之一)将
StreamPartitioner
作为其成员之一

您可以尝试以下代码:

builder.stream(“输入”,使用(Serdes.ByteArray(),Serdes.ByteArray()))
.to(“输出”,生成的.with(Serdes.ByteArray(),Serdes.ByteArray(),(topicName,key,value,numberOfPartitions)->calculatePartition(topicName,key,value,numberOfPartitions));
在上面的代码中,只使用了
ByteArray
Serdes
,因此任何特殊的序列化或反序列化都会发生。

生成的
(这是
KStream::to
参数之一)将
StreamPartitioner
作为其成员之一

您可以尝试以下代码:

builder.stream(“输入”,使用(Serdes.ByteArray(),Serdes.ByteArray()))
.to(“输出”,生成的.with(Serdes.ByteArray(),Serdes.ByteArray(),(topicName,key,value,numberOfPartitions)->calculatePartition(topicName,key,value,numberOfPartitions));

在上面的代码中,仅使用
ByteArray
Serdes
,因此可以进行任何特殊的序列化或反序列化。

首先,在Kafka中,客户端基于分区器在分区之间分发消息。默认分区器将分区计算为
partition=hash(key)%nr\u分区
。我的分区程序执行了一些不同的操作(由于应用程序逻辑原因)。其次,我正在将主题作为一次性操作复制,作为更大的事件源迁移计划的一部分。我想您可以利用使用Apache MirrorMaker进行镜像。它也有同样的问题。MirrorMaker使用嵌入式生产者,因此,它当然必须为输出记录计算分区。显然,它会使用默认的分区器,这在我的情况下是错误的。你试过mirror maker吗?我相信只要你为你的消息提供了适当的密钥,你的消息就会以与原始主题中分区相同的方式在分区之间分发。如果不这样做,那么镜像的整个要点就会失败t thread他们提到调整MM代码。在这种情况下,使用标准的
KafkaProducer
KafkaConsumer
更容易实现。首先,在Kafka中,客户端基于分区器在分区之间分发消息。默认分区器将分区计算为
partition=hash(key)%nr\u分区
。我的分区程序执行了一些不同的操作(由于应用程序逻辑原因)。其次,我正在将主题作为一次性操作复制,作为更大的事件源迁移计划的一部分。我想您可以利用使用Apache MirrorMaker进行镜像。它也有同样的问题。MirrorMaker使用嵌入式生产者,因此,它当然必须为输出记录计算分区。显然,它会使用默认的分区器,这在我的情况下是错误的。你试过mirror maker吗?我相信,只要你为你的消息提供了适当的密钥,你就可以使用mirror maker
val builder = StreamsBuilder()
builder
    .stream<Any, Any>(inputTopic)
    .to(outputTopic)