弹性搜索-Kafka Connect无法将正确的密钥值发布为文档ID

时间:2020-06-10 08:18:46

标签: elasticsearch apache-kafka apache-kafka-connect

我正在尝试使用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不发布任何数据。

2 个答案:

答案 0 :(得分:1)

"key.ignore":"true",确实在做应该做的事情。它忽略了Kafka消息的键,而是使用topic + partition + offset的元组,这可以在带引号的Elasticsearch输出中看到:

  "_id" : "k-connect-status+1+17",

如果要使用Kafka消息的密钥,则需要设置"key.ignore":"false"

查看本教程以了解更多信息,并查看键video / code

的说明。

答案 1 :(得分:1)

Elasticsearch Sink Connector默认情况下通过串联以下主题创建文档_id:主题,分区和偏移量。它发生在您的情景中。 您应该在key.ignore上设置false并提供正确的密钥。

如果您需要从消息值中提取一些信息并将其放入密钥中,则应使用正确的Transformation。我认为您可以尝试使用ValueToKey