我正在尝试使用Kafka connect将数据从kafka主题发布到Elastic搜索。 下面是我的配置。
{
"name": "elasticsearch_sink_19",
"config": {
"connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
"tasks.max": "1",
"topics": "k-connect-status",
"connection.url": "http://docker.for.mac.host.internal:9200",
"type.name": "connectstatus",
"behavior.on.malformed.documents": "ignore",
"errors.tolerance": "all",
"errors.log.enable": "true",
"errors.log.include.messages": "true",
"value.converter": "org.apache.kafka.connect.json.JsonConverter",
"key.converter": "org.apache.kafka.connect.storage.StringConverter",
"validate.non.null": "false",
"key.ignore":"true",
"schema.ignore":"true",
"value.converter.schemas.enable": "false"
}
}
“ key.ignore” true是发布具有错误_id(不是预期的_id)的数据。
主题数据:
格式:JSON
{
"ROWTIME":1591743374742,
"ROWKEY":"status-connector-elasticsearch_sink_31",
"state":"RUNNING",
"trace":null,
"worker_id":"connect:8083",
"generation":2
}
示例弹性搜索输出:
{
"_index" : "k-connect-status",
"_type" : "connectstatus",
"_id" : "k-connect-status+1+17",
"_score" : 1.0,
"_source" : {
"generation" : 11,
"trace" : null,
"state" : "UNASSIGNED",
"worker_id" : "connect:8083"
}
}
预期的弹性搜索输出
{
"_index" : "k-connect-status",
"_type" : "connectstatus",
"_id" : "status-connector-elasticsearch_sink_31",
"_score" : 1.0,
"_source" : {
"generation" : 11,
"trace" : null,
"state" : "UNASSIGNED",
"worker_id" : "connect:8083"
}
}
ROWKEY作为弹性搜索的_id。 Atleast ROWKEY附加主题名称。
“ key.ignore” false不发布任何数据。
答案 0 :(得分:1)
"key.ignore":"true",
确实在做应该做的事情。它忽略了Kafka消息的键,而是使用topic + partition + offset的元组,这可以在带引号的Elasticsearch输出中看到:
"_id" : "k-connect-status+1+17",
如果要使用Kafka消息的密钥,则需要设置"key.ignore":"false"
答案 1 :(得分:1)
Elasticsearch Sink Connector默认情况下通过串联以下主题创建文档_id:主题,分区和偏移量。它发生在您的情景中。
您应该在key.ignore
上设置false
并提供正确的密钥。
如果您需要从消息值中提取一些信息并将其放入密钥中,则应使用正确的Transformation。我认为您可以尝试使用ValueToKey。