2

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

4

2 回答 2

4

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

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

如果您想为每条新消息编写 1 个新文件,则不应该使用数据序列化系统。这与序列化的目标相反。在这种情况下,您希望将元数据和数据分开。

在编写 avro 文件时,没有可用于消除架构的选项。这将违反 avro 规范。

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

于 2018-07-27T06:25:24.847 回答
2

您是对的,如果您使用模式编写单个记录,则会产生开销。这可能看起来很浪费,但在某些情况下,使用此模式从数据构造记录的能力比有效负载的大小更重要。

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

最后,像 Kafka 这样的框架可以插入到Schema Registry中,它们不是将模式与每条记录一起存储,而是存储一个指向模式的指针。

于 2019-05-22T04:08:03.110 回答