Я использую KafkaConnect - MongoSource со следующей конфигурацией:

curl -X PUT http://localhost:8083/connectors/mongo-source2/config -H "Content-Type: application/json" -d '{
  "name":"mongo-source2",
  "tasks.max":1,
  "connector.class":"com.mongodb.kafka.connect.MongoSourceConnector",
  "key.converter":"org.apache.kafka.connect.storage.StringConverter",
  "value.converter":"org.apache.kafka.connect.storage.StringConverter",
  "connection.uri":"mongodb://xxx:xxx@localhost:27017/mydb",
  "database":"mydb",
  "collection":"claimmappingrules.66667777-8888-9999-0000-666677770000",
  "pipeline":"[{\"$addFields\": {\"something\":\"xxxx\"} }]",
  "transforms":"dropTopicPrefix",
  "transforms.dropTopicPrefix.type":"org.apache.kafka.connect.transforms.RegexRouter",
  "transforms.dropTopicPrefix.regex":".*",
  "transforms.dropTopicPrefix.replacement":"my-topic"
}'

По какой-то причине, когда я использую сообщения, я получаю странный ключ:

 "_id": {
"_data": "825DFD2A53000000012B022C0100296E5A1004060C0FB7484A4990A7363EF5F662CF8D465A5F6964005A1003F9974744D06AFB498EF8D78370B0CD440004"
  }

Я понятия не имею, откуда это взялось. _id моего документа mongo - это UUID. Когда я использую сообщения, я должен был увидеть поле documentKey в моем потребительском ключе.

Вот пример сообщения о том, что коннектор опубликовал в kafka:

{
  "_id": {
    "_data": "825DFD2A53000000012B022C0100296E5A1004060C0FB7484A4990A7363EF5F662CF8D465A5F6964005A1003F9974744D06AFB498EF8D78370B0CD440004"
  },
  "operationType": "replace",
  "clusterTime": {
    "$timestamp": {
      "t": 1576872531,
      "i": 1
    }
  },
  "fullDocument": {
    "_id": {
      "$binary": "+ZdHRNBq+0mO+NeDcLDNRA==",
      "$type": "03"
    },
    ...
  },
  "ns": {
    "db": "security",
    "coll": "users"
  },
  "documentKey": {
    "_id": {
      "$binary": "+ZdHRNBq+0mO+NeDcLDNRA==",
      "$type": "03"
    }
  }
}
2
toto 21 Дек 2019 в 00:00
1
Вы пробовали использовать org.apache.kafka.connect.json.JsonConverter для key.converter и value.converter?
 – 
Nitin
21 Дек 2019 в 00:25
Я попробовал это сейчас (я также отключил схему для ключа и значения) и получил этот ключ (все еще имеет странные _data): ===> {"schema":{"type":"string","Optional":false} ,"полезная нагрузка":"{\"_id\": {\"_data\": \"825DFD4132000000012B022C0100296E5A1004060C0FB7484A4990A7363EF5F662CF8D465A5F6964005A1003F9974744D06AFB493744D06AFB493744D06}"4"4}B06AFB493744D06}"4"4}
 – 
toto
21 Дек 2019 в 00:49
Вы говорите, что отключили схему, но она есть в том, что вы опубликовали. Кроме того, этот коннектор Mongo является открытым исходным кодом, если вы хотите узнать, что означает каждое поле.
 – 
OneCricketeer
21 Дек 2019 в 05:44
Да, я делаю некоторые тесты и по ошибке поставил его со схемой. но когда я отключаю схему, я получаю тот же результат с «_data» только без схемы. Документация потока Mongo говорит, что они помещают туда этот _id -> _data, это токен возобновления, но вопрос в том, можем ли мы легко использовать documentKey-> id-> двоичный файл (сверху) в качестве ключа Kafka? потому что это фактический ключ документа.
 – 
toto
21 Дек 2019 в 19:59

1 ответ

Документация, связанная со схемой для конфигурации подключения Kafka, действительно ограничена. Я знаю, что уже слишком поздно отвечать, но в последнее время я столкнулся с той же проблемой и нашел решение методом проб и ошибок.

Я добавил эти две конфигурации в свою конфигурацию mongodb-kafka-connect —

"output.format.key": "schema",
"output.schema.key": "{\"name\":\"sampleId\",\"type\":\"record\",\"namespace\":\"com.mongoexchange.avro\",\"fields\":[{\"name\":\"documentKey._id\",\"type\":\"string\"}]}",

Но все же даже после этого я не знаю, имел ли возобновление_токен потока изменений как ключ для выделения раздела kafka какое-либо значение с точки зрения производительности или даже в случае, когда срок действия возобновления_токена истекает из-за длительного бездействия.

P.S. - Окончательная версия моей конфигурации kafka connect для mongodb в качестве источника такова -

{
  "tasks.max": 1,
  "connector.class": "com.mongodb.kafka.connect.MongoSourceConnector",
  "key.converter": "org.apache.kafka.connect.storage.StringConverter",
  "value.converter": "org.apache.kafka.connect.storage.StringConverter",
  "connection.uri": "mongodb://example-mongodb-0:27017,example-mongodb-1:27017,example-mongodb-2:27017/?replicaSet=replicaSet",
  "database": "exampleDB",
  "collection": "exampleCollection",
  "output.format.key": "schema",
  "output.schema.key": "{\"name\":\"ClassroomId\",\"type\":\"record\",\"namespace\":\"com.mongoexchange.avro\",\"fields\":[{\"name\":\"documentKey._id\",\"type\":\"string\"}]}",
  "change.stream.full.document": "updateLookup",
  "copy.existing": "true",
  "topic.prefix": "mongodb"
}
0
priyesh.patel 7 Апр 2021 в 13:25
Почему вы выбрали «output.format.key»: «схема»? Разве «output.format.key»: «json» тоже не работает?
 – 
Gatsby Lee
3 Ноя 2021 в 21:43