我正在尝试建立一个测试,以将数据从MySQL移动到Elasticsearch。
我有一个带有代理,zookeeper,connect,ksql服务器和cli,架构注册表和Elasticsearch的docker化设置。我正在使用融合版本 5.1.0 中的docker映像,对于Elasticsearch,我正在使用 elasticsearch:6.5.4
我配置了一个 JDBC连接器,以将数据从MySQL获取到Kafka,这是有效的,我看到创建了主题,并且使用ksql-cli在更新以下行时可以看到流中的新消息。 MySQL。
我还配置了一个 Elasticsearch接收器连接器,该连接器已成功创建,并且Elasticsearch中的索引也在那里,但是我发现 Elasticsearch索引中没有文档。 >
这是ES接收器连接器配置:
{
"name": "es-connector",
"config": {
"connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"key.converter": "io.confluent.connect.avro.AvroConverter",
"key.converter.schema.registry.url": "http://schema-registry:8081",
"value.converter.schema.registry.url": "http://schema-registry:8081",
"connection.url": "http://es:9200",
"type.name": "_doc",
"topics": "test_topic",
"drop.invalid.message": true,
"behavior.on.null.values": "ignore",
"behavior.on.malformed.documents": "ignore",
"schema.ignore": true
}
}
这是我查询接收器连接器的状态时看到的:curl -X GET http://connect:8083/connectors/es-connector
{
"name": "es-connector",
"connector": {
"state": "RUNNING",
"worker_id": "connect:8083"
},
"tasks": [
{
"state": "RUNNING",
"id": 0,
"worker_id": "connect:8083"
}
],
"type": "sink"
}
在Elasticsearch中,我可以看到索引http://es:9200/test_topic/_search
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
我一直在MySQL中进行更新和插入,我使用ksql-cli在流中看到消息,但在Elasticsearch中未创建任何文档。我什至使用kafka-avro-console-producer
手动创建了一个主题并发布了消息,然后为该主题创建了另一个接收器连接器,并且得到了相同的结果,我看到了索引但没有文档。
我没有在kafka-connect中看到任何错误,所以我不明白为什么它不起作用。连接器配置有问题吗?我想念什么吗?
编辑:
对于Elasticsearch接收器配置,我尝试使用以下行:
"drop.invalid.message": true,
"behavior.on.null.values": "ignore",
"behavior.on.malformed.documents": "ignore",
"schema.ignore": true
结果相同,没有文档。
修改
我发现了错误:
密钥用作文档ID,不能为空
。
答案 0 :(得分:1)
使用
"key.ignore": true
Elasticsearch接收器将使用topic + partition + offset作为Elasticsearch文档ID。如您所见,您将获得每条消息的新文档。
使用
"key.ignore": false
Elasticsearch接收器将使用Kafka消息的 Key 作为Elasticsearch文档ID。如果您在Kafka消息中没有密钥,则可以理解会收到错误Key is used as document id and cannot be null
。您可以使用多种方法来设置Kafka消息中的密钥,包括“单一消息转换”以设置通过Kafka Connect detailed here提取时的Kafka消息密钥。