Apache flink 使用Flink 1.9.1下的合流注册表序列化Kafka消息

Apache flink 使用Flink 1.9.1下的合流注册表序列化Kafka消息,apache-flink,flink-streaming,confluent-schema-registry,Apache Flink,Flink Streaming,Confluent Schema Registry,是否可以通过Confluent将消息发布到Kafka,并使用KafkaAvroSerializer序列化。我使用的是Flink 1.9.1,我已经看到Flink avro(1.11.0)的更新版本正在进行一些开发,但我坚持使用该版本 我想使用新引入的KafkaSerializationSchema将消息序列化到汇合模式注册表和Kakfa 现在我有一个类正在将类类型T转换为avro,但我想使用合流序列化 公共类KafkaMessageSerialization实现KafkaSerializatio

是否可以通过Confluent将消息发布到Kafka,并使用
KafkaAvroSerializer
序列化。我使用的是Flink 1.9.1,我已经看到Flink avro(1.11.0)的更新版本正在进行一些开发,但我坚持使用该版本

我想使用新引入的
KafkaSerializationSchema
将消息序列化到汇合模式注册表和Kakfa

现在我有一个类正在将类类型
T
转换为avro,但我想使用合流序列化

公共类KafkaMessageSerialization实现KafkaSerializationSchema{
公共静态最终记录器LOG=LoggerFactory.getLogger(KafkaMessageSerialization.class);
最后一个私有字符串主题;
公共卡夫卡消息序列化(字符串主题){
this.topic=主题;
}
@凌驾
公共生产记录序列化(T事件,长时间戳){
final ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
final Schema=event.getSchema();
最终DatumWriter=新的反射DatumWriter(模式);
final BinaryEncoder binEncoder=EncoderFactory.get().BinaryEncoder(outputStream,null);
试一试{
writer.write(事件、二进制编码器);
binEncoder.flush();
}捕获(最终异常e){
LOG.error(“序列化错误”,e);
抛出新的运行时异常(e);
}
返回新的ProducerRecord(主题outputStream.toByteArray());
}
}

使用非常方便
.addSink(新的FlinkKafkaProducer(SINK\u主题,新的KafkaMessageSerialization(SINK\u主题),ProducerOps,Semantic.至少一次))

基于您的解决方案,我编写了这个类。我已经用Flink 1.10.1测试过了

公共类汇合avromessageserialization实现KafkaSerializationSchema{
public static final org.slf4j.Logger LOG=LoggerFactory.getLogger(ConfluentAvroMessageSerialization.class);
最后一个私有字符串主题;
最终私人援助;
最后一个私有的int magicByte;
公共合流AVROMessageSerialization(字符串主题、字符串schemaRegistryUrl)抛出IOException、RestClientException{
magicByte=0;
this.topic=主题;
SchemaRegistryClient schemaRegistry=新缓存的SchemaRegistryClient(schemaRegistryUrl,1000);
SchemaMetadata SchemaMetadata=schemaRegistry.getLatestSchemaMetadata(主题+“-value”);
schemaId=schemaMetadata.getId();
LOG.info(“找到主题{}的合流模式ID{}”,schemaId,topic);
}
@凌驾
公共生产记录序列化(T事件,长时间戳){
final ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
final Schema=event.getSchema();
最终DatumWriter=新的反射DatumWriter(模式);
final BinaryEncoder binEncoder=EncoderFactory.get().BinaryEncoder(outputStream,null);
试一试{
byte[]schemaIdBytes=ByteBuffer.allocate(4).putInt(schemaId.array();
outputStream.write(magicByte);//汇合的magicByte
outputStream.write(schemaIdBytes);//汇合模式ID(4字节格式)
write.write(事件,binEncoder);//Avro数据
binEncoder.flush();
}捕获(最终异常e){
LOG.error(“模式注册表序列化错误”,e);
抛出新的运行时异常(e);
}
返回新的ProducerRecord(主题outputStream.toByteArray());
}
}

Confluent有一个属性格式,带有一个魔术字节和模式id(4字节)。有关更多信息,请检查

代码似乎已添加到flink:中,但在库中不可用