Avro消息中的架构

时间:2018-07-22 19:44:32

标签: apache avro spark-avro avro-tools avro4s

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

2 个答案:

答案 0 :(得分:1)

我正在阅读Avro Specs

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

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

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

IMO,将多条消息批处理到单个avro文件中时应保持平衡。理想情况下,应该将Avro文件分解以提高I / O效率。如果使用HDFS,则块大小将是理想的avro文件大小。

答案 1 :(得分:0)

您是正确的,如果使用架构编写单个记录,则会产生开销。这似乎很浪费,但是在某些情况下,使用这种模式从数据构造记录的能力比有效负载的大小更为重要。

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

最后,像Kafka这样的框架可以插入Schema Registry,在这里,与其存储每条记录的架构,不如存储每条记录的指针。