我正在尝试通过confluent-4.1.1 使用 confluent Kafka s3连接器。
s3-sink
"value.converter.schema.registry.url": "http://localhost:8081",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"key.converter": "org.apache.kafka.connect.storage.StringConverter"
当我为s3接收器运行Kafka连接器时,出现以下错误消息:
ERROR WorkerSinkTask{id=singular-s3-sink-0} Task threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerTask:172)
org.apache.kafka.connect.errors.DataException: Invalid JSON for array default value: "null"
at io.confluent.connect.avro.AvroData.defaultValueFromAvro(AvroData.java:1649)
at io.confluent.connect.avro.AvroData.toConnectSchema(AvroData.java:1562)
at io.confluent.connect.avro.AvroData.toConnectSchema(AvroData.java:1443)
at io.confluent.connect.avro.AvroData.toConnectSchema(AvroData.java:1443)
at io.confluent.connect.avro.AvroData.toConnectSchema(AvroData.java:1323)
at io.confluent.connect.avro.AvroData.toConnectData(AvroData.java:1047)
at io.confluent.connect.avro.AvroConverter.toConnectData(AvroConverter.java:87)
at org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:468)
at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:301)
at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:205)
at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:173)
at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:170)
at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:214)
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)
我的模式仅包含1个数组类型字段,其模式如下
{"name":"item_id","type":{"type":"array","items":["null","string"]},"default":[]}
我可以使用kafka-avro-console-consumer命令查看反序列化消息。我见过similar question,但在他的情况下,他也在使用Avro序列化程序作为密钥。
./confluent-4.1.1/bin/kafka-avro-console-consumer --topic singular_custom_postback --bootstrap-server localhost:9092 -max-messages 2
"item_id":[{"string":"15552"},{"string":"37810"},{"string":"38061"}]
"item_id":[]
由于包含敏感的用户信息,因此无法放置从控制台使用者获得的全部输出,因此我在架构中添加了唯一的数组类型字段。
先谢谢了。
答案 0 :(得分:0)
与您链接到的问题相同的问题。
In the source code,您可以看到此情况。
case ARRAY: {
if (!jsonValue.isArray()) {
throw new DataException("Invalid JSON for array default value: " + jsonValue.toString());
}
在您的情况下将架构类型定义为type:"array"
时,可能会引发异常,但是有效负载本身具有null
值(或任何其他值类型),而不是实际的数组,尽管您已将其定义为架构默认值。仅当根本没有items
元素时才应用默认值,而当"items":null
除此之外,我建议使用类似的架构,即记录对象,而不仅仅是命名数组,默认为空数组,而不是null
。
{
"type" : "record",
"name" : "Items",
"namespace" : "com.example.avro",
"fields" : [ {
"name" : "item_id",
"type" : {
"type" : "array",
"items" : [ "null", "string" ]
},
"default": []
} ]
}
答案 1 :(得分:0)
调用io.confluent.connect.avro.AvroData.defaultValueFromAvro(AvroData.java:1649)
用于将您读取的消息的avro模式转换为连接接收器的内部模式。我相信这与您的邮件数据无关。这就是AbstractKafkaAvroDeserializer
可以成功反序列化您的消息(例如,通过kafka-avro-console-consumer
)的原因,因为您的消息是有效的Avro消息。如果您的默认值为null
,而null
不是您字段的有效值,则可能会发生上述异常。例如
{
"name":"item_id",
"type":{
"type":"array",
"items":[
"string"
]
},
"default": null
}
我建议您对连接进行远程调试,看看到底是什么原因。