我在通过Beam通过FlinkKafkaProducer
/ FlinkKafkaConsumer
读取/编写Avro数据时遇到了一些问题。
如果有人可以使用Avro架构(不使用融合版Kafka)指向FlinkKafkaProducer
和FlinkKafkaConsumer
的工作示例,那就太棒了
A)BeamKafkaFlinkAvroProducerTest(制片人)
如果我直接使用KafkaProducer(即调用 produceSimpleData ),一切正常(仅用于测试)。使用FlinkKafkaProducer
作为UnboundedSource(这是我应该做的)
(即我通过以下步骤调用 produceAvroData2 ):
首先,如果我使用AvroSerializationSchema schema = new AvroSerializationSchema(Test.class);
即。基本上使用Avro的org.apache.avro.specific.SpecificDatumWriter
;我面临以下错误:
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.avro.generic.IndexedRecord
at org.apache.avro.generic.GenericData.getField(GenericData.java:580)
at org.apache.avro.generic.GenericData.getField(GenericData.java:595)
at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:112)
at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:104)
接下来,如果我使用TypeInformationSerializationSchema
(无论管道中的AvroCoder如何),显然工作正常,因为Kafka测试消费者工具会打印消息:
java.lang.String{"uname": "Joe", "id": 6}
B)BeamKafkaFlinkAvroConsumerTest(消费者)
我知道我们应该在使用者和制作者中使用TypeInformationSerializationSchema
或者分别在Consumer和Producer中使用AvroDeserializationSchema
和AvroSerializationSchema
。
但是,无论使用AvroDeserializationSchema
还是TypeInformationSerializationSchema
,我都会遇到以下异常:
Exception in thread "main" java.lang.NullPointerException: null value in entry: V=null
at com.google.common.collect.CollectPreconditions.checkEntryNotNull(CollectPreconditions.java:33)
at com.google.common.collect.SingletonImmutableBiMap.<init>(SingletonImmutableBiMap.java:39)
at com.google.common.collect.ImmutableBiMap.of(ImmutableBiMap.java:49)
at com.google.common.collect.ImmutableMap.of(ImmutableMap.java:70)
at org.apache.beam.sdk.coders.CoderRegistry.getDefaultOutputCoder(CoderRegistry.java:221)
可能遗漏了一些非常基本的东西。所有代码均为here。