Avro消息中的架构



我看到Avro消息嵌入了模式,然后嵌入了二进制格式的数据。如果发送了多条消息,并且为每条消息创建了新的avro文件,那么Schema嵌入不是开销吗?那么,这是否意味着,对生产者来说,批量处理消息然后写入总是很重要的,所以多个消息写入一个avro文件,只携带一个模式?另一方面,在使用Generic/SpecicDatum编写器进行序列化时,是否有消除模式嵌入的选项?

我正在阅读Avro Specs 的以下要点

  • Apache Avro是一个数据序列化系统
  • Avro依赖于模式
  • 读取Avro数据时,写入数据时使用的模式始终为目前
  • 序列化的目标是避免每个值开销,使序列化既快又小
  • 当Avro数据存储在一个文件中时,其模式也随之存储

如果您想为每个新消息写入一个新文件,则不应该使用数据序列化系统。这和序列化的目标相反。在这种情况下,您需要分离元数据和数据。

在编写avro文件时,没有消除模式的选项。这将违反avro规范。

IMO,在将多个消息批处理到单个avro文件中时应该保持平衡。理想情况下,应该对Avro文件进行细分,以提高i/o效率。在HDFS的情况下,块大小将是理想的avro文件大小。

你是对的,如果你用模式写一条记录,会有开销。这可能看起来很浪费,但在某些情况下,使用该模式从数据构建记录的能力比有效负载的大小更重要。

还要考虑到,即使包含了模式,数据也以二进制格式编码,因此通常比Json小。

最后,像Kafka这样的框架可以插入Schema Registry,在那里,它们存储的不是每个记录的模式,而是指向该模式的指针。

相关内容

  • 没有找到相关文章

最新更新