如何更改由Kafka Connect Source Connector生成的主题名称

时间:2020-05-17 05:52:11

标签: apache-kafka apache-kafka-connect mongodb-kafka-connector

我已经部署了Kafka-Cluster,并且已经在运行生产,并且主题为“ existing-topic ”。我正在使用Debezium的MongoDB-Source-Connector。

这里我要做的就是将CDC事件直接推送到主题“ existing-topic ”,这样我已经在听该主题的消费者就可以对其进行处理。

我没有找到这样做的任何资源,但是提到该主题是以以下格式创建的-

“如果您的mongodb.name参数为A,数据库名称为B且集合名称为C,则数据库A和集合C的数据将被加载到主题A.B.C下”

我可以将主题更改为“ existing-topic”并将事件推送到该主题吗?

2 个答案:

答案 0 :(得分:0)

根据documentation

Kafka主题的名称始终采用以下形式 logicalName.databaseName.collectionName,其中logicalNamemongodb.name指定的连接器logical name 配置属性,databaseName是数据库的名称,其中 操作发生,并且collectionName是MongoDB的名称 受影响的文档所在的集合。


这意味着,如果连接器的逻辑名称为myConnector,并且数据库myDatabase具有两个集合usersorders

{
  "name": "myConnector",  
  "config": {
    "connector.class": "io.debezium.connector.mongodb.MongoDbConnector", 
    "mongodb.hosts": "mongo-db-host:27017", 
    "mongodb.name": "myDatabase", 
    "collection.whitelist": "myDatabase[.]*", 
  }
}

然后Kafka Connect将使用名称填充两个主题:

  • myConnector.myDatabase.users
  • myConnector.myDatabase.orders

现在,如果您仍想更改目标主题的名称,则可以使用Kafka Connect单消息转换(SMT)。更准确地说,ExtractTopic应该可以为您提供帮助。请注意,尽管此SMT可以帮助您从消息的键或值中提取主题名称,但因此您需要以某种方式在有效负载中包括所需的主题名称。

例如,以下SMT将提取字段myField的值并将其用作记录的主题:

 transforms.ValueFieldExample.type=io.confluent.connect.transforms.ExtractTopic$Value
 transforms.ValueFieldExample.field=myField

答案 1 :(得分:0)

我在使用JDBC Source Connector时遇到了同样的问题,并找到了不同的解决方案:

使用RegexRouter单消息转换和dropPrefix,您可以覆盖整个主题名称:

"transforms":"dropPrefix",
"transforms.dropPrefix.regex":"A.B.C",                 // whole created topic name
"transforms.dropPrefix.replacement":"existing-topic"   // whole exisiting topic name

它与正则表达式一起使用,因此,如果您使用多个表/集合,并且创建的主题名称不是恒定的,则应该可以使其动态化。

从技术上讲,我要删除整个主题名称,然后添加一个新的主题名称,这有点不客气-无论如何,这对我而言并不是最佳解决方案。