如何从Kinesis将JSON消息发送到MSK,然后使用kafka connect进行弹性搜索

时间:2020-01-01 06:17:07

标签: apache-kafka apache-kafka-connect confluent

我已经准备好,流程也正在工作。 我正在使用lambda函数将数据从Kinesis流发送到MSK,消息的格式如下

{
        "data": {
                "RequestID":    517082653,
                "ContentTypeID":        9,
                "OrgID":        16145,
                "UserID":       4,
                "PromotionStartDateTime":       "2019-12-14T16:06:21Z",
                "PromotionEndDateTime": "2019-12-14T16:16:04Z",
                "SystemStartDatetime":  "2019-12-14T16:17:45.507000000Z"
        },
        "metadata":     {
                "timestamp":    "2019-12-29T10:37:31.502042Z",
                "record-type":  "data",
                "operation":    "insert",
                "partition-key-type":   "schema-table",
                "schema-name":  "dbo",
                "table-name":   "TRFSDIQueue"
        }
}

我正在将以下json消息发送到kafka主题

props.put("acks", "all");
            props.put("retries", 0);
            props.put("batch.size", 16384);
            props.put("linger.ms", 1);
            props.put("buffer.memory", 33554432);
            props.put("producer.type", "async");
            props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            Producer<String, String> producer = new KafkaProducer<String, String>(props);
            System.out.println("Inside loop successfully");
            try {
                producer.send(
                        new ProducerRecord<String, String>(topicName, new String(rec.getKinesis().getData().array())));
                Thread.sleep(1000);

                System.out.println("Message sent successfully");
            } catch (Exception e) {
                System.out.println("------------Exception message=-------------" + e.toString());
            }

            finally {
                producer.flush();
                producer.close();
            }

当我启动kafka connect进行弹性搜索时,出现类似

的错误
DataException: Converting byte[] to Kafka Connect data failed due to serialization error

我还修改了quickstart-elasticsearch.properties并将键值序列化器更改为字符串。

当它是json时会抛出错误。

我可以看到弹性搜索中使用kafka主题名称创建了索引,但没有记录。

所以请帮助我解决我的一些困惑。 1.我是否从生产者运动流中正确发送了消息? 我正在使用

props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

或者我应该在这里使用json。但是没有这样的json。

  1. 还是我必须在quickstart-elasticsearch.properties中使用json序列化程序?

  2. 如果事件是插入事件,那么它将在elastci搜索中插入记录,那么在弹性搜索中如何删除和更新Kafka-connect句柄为我们删除和更新?

预先感谢

1 个答案:

答案 0 :(得分:0)

要进行30天的免费试用,您可以使用Kinesis Source Connector,也可以学习如何编写自己的Source Connector并将其部署在Elasticsearch接收器旁边,而不是完全使用lambda ...


其次,向后工作。您可以创建假主题并发送 lambda以外格式相同的记录吗?那些最终在卡夫卡吗? Elasticsearch呢?并从等式中删除Kibana(如果您正在使用它并且它不起作用)

然后专注于lambda集成


回答您的问题

1)您正在以字符串形式发送JSON 。除非您要发送在映射器接口内映射到JSON字符串的POJO类,否则不需要为JSON使用单独的序列化器。

您正在发送JSON记录,因此您应该在Connect中使用JSONConverter,是的。但是,除非您have a schema and payload,否则我认为不会自动创建Elasticsearch映射,因此,一种简单的解决方法是提前创建ES索引映射(但是,如果您已经知道,那么您已经设计了一个架构,因此最终由生产者代码负责发送正确的记录)。

如果您提前定义映射,则应该能够简单地在Connect中使用StringConverter

关于生产者代码,我唯一要更改的是重试次数大于0。并尝试使用资源,而不是显式关闭生产者

   keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

2)您可以在Github问题中搜索连接器,但最后我检查了一下,它会进行完整的文档更新和插入,没有部分更新或任何删除