Avro:重用解码器

Avro: Reusing a decoder

定义要提供给 DatumReader classes 的解码器时,可以选择重用解码器,如下所示。如文档中所述,解码器 class 是不可变且线程安全的,因此重用它确实有意义。最佳做法是什么,是重用解码器吗?如果我们每次尝试解码 Avro 负载时都创建解码器,是否会有性能开销?

DatumReader<T> reader = new ReflectDatumReader<>(writerSchema, readerSchema);
// Second argument is a decoder to be reused
DecoderFactory.get().binaryDecoder(record, null);
reader.read(null, binaryDecoder);

这种优化应该没有必要,而且实际上可能不会提高性能。如果您发现其他情况,请告诉我们。

基本上,作为工作描述的一部分,编码器是在管道提交期间创建和序列化的。它在每个后端被反序列化以创建给定工作单元的实例。这些工作单元足够大,不应该创建大量的编码器,所以它不应该是一个性能问题。

此外,AvroCoder 序列化模式,因此反射不会执行多次。此外,仅共享实例(如所描述的)实际上不会导致反序列化实例被共享。