Apache nifi 连接合流Kafka和InfluxDB时出现NullPointerException

Apache nifi 连接合流Kafka和InfluxDB时出现NullPointerException,apache-nifi,apache-kafka-connect,confluent-platform,Apache Nifi,Apache Kafka Connect,Confluent Platform,我正试图使用Confluent将卡夫卡主题中的数据输入我的XDB 首先,我使用nifi将数据从日志文件传输到kafka topic,效果良好。卡夫卡主题获取数据,如下所示: { "topic": "testDB5", "key": null, "value": { "timestamp": "2019-03-20 01:24:29,461", "measurement": "INFO", "thread": "NiFi Web Se

我正试图使用Confluent将卡夫卡主题中的数据输入我的XDB

首先,我使用nifi将数据从日志文件传输到kafka topic,效果良好。卡夫卡主题获取数据,如下所示:

  {
    "topic": "testDB5",
    "key": null,
    "value": {
      "timestamp": "2019-03-20 01:24:29,461",
      "measurement": "INFO",
      "thread": "NiFi Web Server-795",
      "class": "org.apache.nifi.web.filter.RequestLogger",
      "message": "Attempting request for (anonymous) 
    },
    "partition": 0,
    "offset": 0
  }
然后,我通过Kafka Connect UI创建XDB接收器连接器,得到以下异常:

org.apache.kafka.connect.errors.ConnectException: Exiting WorkerSinkTask due to unrecoverable exception.
    at org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:587)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:323)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:226)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:194)
    at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:175)
    at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:219)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at io.confluent.influxdb.InfluxDBSinkTask.put(InfluxDBSinkTask.java:140)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:565)
    ... 10 more
但是如果我使用

./bin/kafka-avro-console-producer --broker-list localhost:9092 --topic testDB1 --property value.schema='{"type":"record","name":"myrecord","fields":[{"name":"measurement","type":"string"},{"name":"timestamp","type":"string"}]}'
它可以工作,我的XDB可以获取数据

以下是连接配置:

connector.class=io.confluent.influxdb.InfluxDBSinkConnector
influxdb.url=http://myurl
tasks.max=1
topics=testDB5
连接主题testDB1的配置相同,只是主题名称不同


nifi有什么问题吗?但它可以很好地将数据传输到topic。

当您将Avro与Kafka Connect一起使用时,Avro反序列化程序希望数据已使用进行序列化。这就是kafak avro控制台制作人使用的,这就是为什么使用它时管道工作的原因

为Avro和模式注册表提供了良好的背景。另见

我不熟悉Nifi,但看看文档,它似乎有使用的选择。您可能还希望将模式写入策略设置为汇合模式注册表引用


一旦您可以使用kafka avro console consumer使用主题中的数据,那么您就知道它已正确序列化,并且可以与kafka Connect接收器一起使用。

我找到了原因。这是因为在Nifi中,我使用PublishKafka_0_10将数据发布到Kafka topic,但其版本太低了

当我在ksql中进行查询时,它说

Input record ConsumerRecord(..data..) has invalid (negative) timestamp.
Possibly because a pre-0.10 producer client was used to write this record to Kafka without embedding a timestamp, 
or because the input topic was created before upgrading the Kafka cluster to 0.10+. Use a different TimestampExtractor to process this data.
所以,我把它改为PublishKafka_1_0,然后重新开始,它就工作了!我的XDB可以获取数据。我说不出话来


谢谢罗宾·莫法特的回复,这对我很有帮助

您如何序列化您写入卡夫卡主题的数据?您在Kafka Connect worker属性文件中使用了哪些serialiser转换器设置?在etc/schema registry/Connect-avro-distributed.properties中,设置为:key.converter=io.confluent.connect.avro.AvroConverter key.converter.schema.registry.url=http://localhost:8081 value.converter=io.confluent.connect.avro.AvroConverter-value.converter.schemas.enable=false-value.converter.schema.registry.url=http://localhost:8081How 您是否正在序列化写入卡夫卡主题的数据?在nifi flow,我使用GrokReader读取日志文件,然后使用AvroRecordSetWriter写入kafka主题,您可以再次单击链接了解更多详细信息实际上,写入kafka并不强制使用模式注册表,因此,我建议他实际使用嵌入Avro模式选项,该选项不要求他提供任何模式。这不是强制性的,除非您想使用Kafka Connect和默认的Avro反序列化程序反序列化Avro数据。因此,是的,你可以把你想要的任何东西放到卡夫卡主题上,但是如果你想让消费者能够阅读,那么另一端你必须使用相同的序列化器/反序列化器。在本例中,Kafka Connect被配置为使用架构注册表Avro反序列化程序,因此,对于要处理的消息,需要使用架构注册表Avro序列化程序将它们放置在Kafka主题上。感谢您的回复。我刚才又试了一次,当数据被Nifi传输到卡夫卡主题时,数据可以被卡夫卡avro控制台消费者使用!但是日志仍然存在该异常java.lang.NullPointerException,并且我的influxDB无法获取数据。是的,我已经将架构写入策略设置为汇合架构注册表引用。因此,如果使用新配置写入新主题,是否可以使用kafka avro控制台使用者使用该主题中的所有消息?连接器仍然会出现同样的错误吗?如果是这样,反序列化后该主题的数据是什么样子的?