如何告诉MongoSource(使用Kafka Connect)序列化什么密钥

时间:2019-12-23 16:53:39

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

我正在使用mongo源码来收听mongo更改流并将所有事件放入kafka,但是我正在努力寻找一种从事件中提取“ Real”键的方法。我尝试了转换,但没有成功,给了我错误:

Caused by: org.apache.kafka.connect.errors.DataException: Only Struct objects supported for [copying fields from value to key], found: java.lang.String

在Mongo来源中,我发现了这个line

这基本上意味着它甚至没有任何键处理,而是查找“ _id”字段(这不是文档的ID,它是简历令牌信息)

相反,我想将主题的键设置为“ documentKey”。

这是连接器发生的事件的示例:

{
 "_id": {
    "_data": "DSAD45543FFWEHTEY004....."
  },
  "operationType": "replace",
  "clusterTime": {
    "$timestamp": {
      "t": 1446707990,
      "i": 1
    }
  },
  "fullDocument": {
    "_id": {
      "$binary": "FxVFgHFRhrr/z+zUc/w==",
      "$type": "03"
    },
    ...
  },
  "ns": {
    "db": "somedb",
    "coll": "somecol"
  },
  "documentKey": {
    "_id": {
      "$binary": "FxVFgHFRhrr/z+zUc/w==",
      "$type": "03"
    }
  }
}

我使用了以下配置:

"transforms":"createKey",
"transforms.createKey.type":"org.apache.kafka.connect.transforms.ValueToKey",
"transforms.createKey.fields":"documentKey"

我尝试过:

org.apache.kafka.connect.json.JsonConverter

以及StringConverter(尽管我不认为这可以通过字符串完成)

org.apache.kafka.connect.storage.StringConverter

有什么方法可以提取密钥? 请注意:架构已禁用。

2 个答案:

答案 0 :(得分:1)

这是因为MongoDB Kafka源连接器尚不支持它。从版本1.3开始,它应该支持高级密钥选择。

https://jira.mongodb.org/browse/KAFKA-40

答案 1 :(得分:0)

  

请注意:架构已禁用

在这种情况下,您不能使用ValueToKey转换。即使您可以,该转换也不支持有效负载中的嵌套值,在您的情况下,该值类似于documentKey._id.$binary