Apache kafka 卡夫卡:将主题A复制到主题B,同时对记录应用转换

Apache kafka 卡夫卡:将主题A复制到主题B,同时对记录应用转换,apache-kafka,apache-kafka-connect,apache-kafka-mirrormaker,Apache Kafka,Apache Kafka Connect,Apache Kafka Mirrormaker,我需要将记录从集群a上的主题镜像到集群B上的主题,同时在记录上添加一个字段作为代理(例如InsertField) 我不控制群集A(但可能需要更改),并完全控制群集B 我知道集群A正在发送序列化JSON 我正在使用with Kafka connect进行镜像,并尝试使用InsertField转换在记录上添加代理数据 我的配置如下所示: connector.class=org.apache.kafka.connect.mirror.MirrorSourceConnector topics=.* so

我需要将记录从集群a上的主题镜像到集群B上的主题,同时在记录上添加一个字段作为代理(例如
InsertField

我不控制群集A(但可能需要更改),并完全控制群集B

我知道集群A正在发送序列化JSON

我正在使用with Kafka connect进行镜像,并尝试使用
InsertField
转换在记录上添加代理数据

我的配置如下所示:

connector.class=org.apache.kafka.connect.mirror.MirrorSourceConnector
topics=.*
source.cluster.alias=upstream
source.cluster.bootstrap.servers=source:9092
target.cluster.bootstrap.servers=target:9092

# ByteArrayConverter to avoid MirrorMaker to re-encode messages
key.converter=org.apache.kafka.connect.converters.ByteArrayConverter
value.converter=org.apache.kafka.connect.converters.ByteArrayConverter


transforms=InsertSource1
transforms.InsertSource1.type=org.apache.kafka.connect.transforms.InsertField$Value
transforms.InsertSource1.static.field=test_inser
transforms.InsertSource1.static.value=test_value
name=somerandomname
此代码将失败,并出现一个错误,说明:

org.apache.kafka.connect.errors.DataException:仅结构对象 支持[字段插入]

有没有一种方法可以在不编写自定义转换的情况下实现这一点(我使用的是Python,不熟悉Java)


非常感谢

如前所述,字节数组转换器没有结构/模式信息,因此无法使用您正在使用的转换(添加字段)

然而,这并不意味着不能使用任何变换



如果要发送JSON消息,则必须发送架构和有效负载信息。

在当前版本的Apache Kafka(2.6.0)中,不能对
MirrorMaker 2.0
记录应用单一消息转换(SMT)

解释

基于
Kafka Connect
框架,在内部,MirrorMaker 2.0驱动程序设置

轮询记录后的源连接器(此步骤中没有转换器(例如或):它们已使用SMT已应用)

带有
字节\u架构的值
。同时,
InsertField
transformation
Type.STRUCT
用于带有模式的记录

所以,由于记录不能确定为,所以不应用转换

参考资料

  • 其他资源


  • 为什么要使用ByteArrayConverter?请尝试使用
    org.apache.kafka.connect.json.JsonConverter
    。在您的案例中,Kafka Connect将您的数据解释为字节数组(非结构化数据),因此无法修改数据(例如插入字段)@IskuskovAlexander谢谢您的输入,Alexander。我认为使用
    ByteArrayConverter
    的想法是,消息在通过连接器时不会被重新序列化。我使用
    org.apache.kafka.connect.json.JsonConverter
    (这是我环境中的默认值),然后值序列化两次。这会产生如下消息:```模式:{type:bytes,optional:false},负载:Eyj0aw1lijogmtywyuyntaxnswginzhbhvlijogoh0=`````(这里负载应该是JSON对象)@IskuskovAlexander我重新制定了我的问题,以帮助理解我的用例。非常感谢您的任何意见!如何从群集B读取复制的消息?@IskuskovAlexander出于调试目的,我用于读取主题内容。这些记录是由汇合的python客户端生成的,比如:
    client.product('topic_name',json.dumps(some_dict).encode('UTF-8'))
    感谢您的输入。我知道ByteArrayConverter是这里的罪魁祸首,但MirrorMaker要求它不要重新序列化消息。所以问题是,在我更新帖子的方式上应用转换时,如何镜像流,以使用例更清晰。你无法避免解码。您希望JSON进行反编码,然后添加一个字段,然后重新编码。您可以添加一个记录头,而不是一个字段,该字段总是序列化为mapIs,可以使用Kafka connect按消息添加头吗?我看到了很多公开的公关,但在纪录片里什么都没有