Kafka Connect Elasticsearch Sink没有索引文件

时间:2019-01-28 12:24:14

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

我正在尝试建立一个测试,以将数据从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,不能为空

1 个答案:

答案 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消息密钥。