我看到Avro消息嵌入了架构,然后嵌入了二进制格式的数据。如果发送了多条消息,并且为每条消息都创建了新的Avro文件,那么Schema不会嵌入开销吗? 那么,这是否意味着对于生产者来说,批处理消息然后进行写入始终很重要,因此将多条消息写入一个avro文件中,只需携带一个模式? 另外,使用Generic / SpecificDatum编写器进行序列化时,是否可以消除模式嵌入?
答案 0 :(得分:1)
我正在阅读Avro Specs
中的以下几点如果要为每条新消息编写1个新文件,则不应使用数据序列化系统。这与序列化的目标相反。在这种情况下,您要分离元数据和数据。
在编写avro文件时,没有可用的选项来消除架构。这将违反avro规范。
IMO,将多条消息批处理到单个avro文件中时应保持平衡。理想情况下,应该将Avro文件分解以提高I / O效率。如果使用HDFS,则块大小将是理想的avro文件大小。
答案 1 :(得分:0)
您是正确的,如果使用架构编写单个记录,则会产生开销。这似乎很浪费,但是在某些情况下,使用这种模式从数据构造记录的能力比有效负载的大小更为重要。
还要考虑到即使包含了架构,数据也以二进制格式编码,因此通常比Json小。
最后,像Kafka这样的框架可以插入Schema Registry,在这里,与其存储每条记录的架构,不如存储每条记录的指针。