Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 使用KafkaAvroSerializer的额外字节_Serialization_Apache Kafka_Avro_Confluent Schema Registry_Alpakka - Fatal编程技术网

Serialization 使用KafkaAvroSerializer的额外字节

Serialization 使用KafkaAvroSerializer的额外字节,serialization,apache-kafka,avro,confluent-schema-registry,alpakka,Serialization,Apache Kafka,Avro,Confluent Schema Registry,Alpakka,我的设置如下:我正在从ftp服务器检索xml文件,将其解组为POJO,将其映射为Avro生成的类,然后将其转发为类似的类: Ftp.ls(“/”,Ftp设置) .filter(FtpFile::isFile) .mapAsyncUnordered(10, ftpFile->{ CompletionStage获取文件= fromPath(ftpFile.path(),ftpSettings).runWith(Sink.reduce((a,b)->a),materializer); 返回文件; })

我的设置如下:我正在从ftp服务器检索xml文件,将其解组为POJO,将其映射为Avro生成的类,然后将其转发为类似的类:

Ftp.ls(“/”,Ftp设置)
.filter(FtpFile::isFile)
.mapAsyncUnordered(10,
ftpFile->{
CompletionStage获取文件=
fromPath(ftpFile.path(),ftpSettings).runWith(Sink.reduce((a,b)->a),materializer);
返回文件;
})
.map(b->b.decodeString(Charsets.ISO_8859_1))
.map(StringReader::新建)
.map(AlpakkaProducerDemo::解组半文件)
.map(AlpakkaProducerDemo::converttoavroserizable)
.map(a->新产品记录(kafkaTopic,a.id().toString(),a))
.map(记录->产品消息.single(记录))
.runWith(Producer.committeablesink(producerSettings,kafkaProducer),materialer);
问题是序列化显然不能正常工作。例如,我希望密钥也是avro序列化的,尽管它只是一个字符串(要求,不要问)。其配置如下所示:

Map<String, Object> kafkaAvroSerDeConfig = new HashMap<>();
kafkaAvroSerDeConfig.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, schemaRegistryUrl);
final KafkaAvroSerializer keyAvroSerializer = new KafkaAvroSerializer();
keyAvroSerializer.configure(kafkaAvroSerDeConfig, true);
final Serializer<Object> keySerializer = keyAvroSerializer;
final Config config = system.settings().config().getConfig("akka.kafka.producer");
final ProducerSettings producerSettings = ProducerSettings.create(config, keySerializer, valueSerializer)
  .withBootstrapServers(kafkaServer);
Map kafkaAvroSerDeConfig=new HashMap();
kafkaAvroSerDeConfig.put(AbstractKafkaAvroSerDeConfig.SCHEMA\u REGISTRY\u URL\u CONFIG,schemaRegistryUrl);
最终KafkaAvroSerializer keyAvroSerializer=新KafkaAvroSerializer();
configure(kafkaAvroSerDeConfig,true);
最终序列化程序keySerializer=keyAvroSerializer;
final Config=system.settings().Config().getConfig(“akka.kafka.producer”);
最终ProducerSettings ProducerSettings=ProducerSettings.create(配置、键序列化器、值序列化器)
.使用BootstrapServer(kafkaServer);

在卡夫卡中,这会产生一个具有正确内容的键,但在字符串开头会有一些(明显的)额外字节:
\u0000\u0000\u0000\u0000\u0001N
。正如您可以想象的那样,这会对价值造成严重破坏。我怀疑Avro序列化与Alpakka使用的信封API不兼容,因此可能需要事先序列化为
字节[]
,并使用公共
字节序列化器。但是,使用SchemaRegistry没有实际意义。

前五个字节与模式注册表中的序列化格式版本(字节0)和Avro模式版本(字节1-4)有关


另一种选择是使用Kafka Connect,并使用FTP源代码和XML转换

前五个字节与模式注册表中的序列化格式版本(字节0)和Avro模式版本(字节1-4)有关:


另一种选择是使用Kafka Connect,并使用FTP源代码和XML转换

感谢您的快速澄清!我们考虑连接,但也想评估Alpkka。字节出现在key/value中有什么明显的原因吗?它们会出现,因为这是序列化导线格式。如果你不想要它们…不要使用serialiser:)这也是为什么Kafka Connect是一个不错的选择的另一个原因它只适用于输入/输出的序列化。不知道为什么或如何,因为我没有更改任何东西,但今天神奇的字节没有出现,序列化就可以了…感谢您的快速澄清!我们考虑连接,但也想评估Alpkka。字节出现在key/value中有什么明显的原因吗?它们会出现,因为这是序列化导线格式。如果你不想要它们…不要使用serialiser:)这也是为什么Kafka Connect是一个很好的选择的另一个原因它只适用于输入/输出的序列化。不知道为什么或如何,因为我没有改变任何东西,但今天神奇的字节没有出现,序列化只起作用。。。
Map<String, Object> kafkaAvroSerDeConfig = new HashMap<>();
kafkaAvroSerDeConfig.put(AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, schemaRegistryUrl);
final KafkaAvroSerializer keyAvroSerializer = new KafkaAvroSerializer();
keyAvroSerializer.configure(kafkaAvroSerDeConfig, true);
final Serializer<Object> keySerializer = keyAvroSerializer;
final Config config = system.settings().config().getConfig("akka.kafka.producer");
final ProducerSettings producerSettings = ProducerSettings.create(config, keySerializer, valueSerializer)
  .withBootstrapServers(kafkaServer);