Avro架构存储

时间:2013-08-01 18:30:57

标签: serialization thrift avro

我们正在评估avro v / s thrift的存储空间。在这一点上,Avro似乎是我们的选择,但是文档声明模式在序列化时与数据一起存储,有没有办法避免这种情况,因为我们既生产和消费数据,我们想知道是否我们可以避免序列化模式,并且序列化数据与模式的大小差异是否比没有模式的数据大得多?

2 个答案:

答案 0 :(得分:0)

我很确定您始终需要将架构与数据一起存储。这是因为Avro在读取和写入.avro文件时会使用它。

根据http://docs.oracle.com/cd/NOSQL/html/GettingStartedGuide/avroschemas.html

  

使用Avro绑定将架构应用于Oracle NoSQL数据库记录的值部分。这些绑定用于在写入值之前序列化值,并在读取值后反序列化值。这些绑定的使用要求您的应用程序使用Avro数据格式,这意味着每个存储的值都与模式相关联。

就尺寸差异而言,您只需要存储一次架构,因此在大型方案中,它并没有那么大的差别。我的架构占用了105.5KB(这是一个非常大的架构,你的架构不应该那么大),每个序列化的值占用3.3KB。我不确定数据的原始json有什么不同,但根据我发布的那个链接:

  

除了小的内部模式标识符之外,每个值的存储都没有任何元数据,大小在1到4个字节之间。

但我相信这可能仅适用于单一,简单的价值观。

这对我来说是HDFS。

答案 1 :(得分:0)

感谢JGibel,我们的数据最终会最终以HDFS结束,而对象容器文件格式确实只能将架构写为文件头。

对于HDFS以外的用途,我错误地假设模式将附加到每个编码数据,但事实并非如此,这意味着您需要使用模式对其进行反序列化,但序列化数据不必具有附加到它的模式字符串。

E.g。

DatumWriter<TransactionInfo> eventDatumWriter = new SpecificDatumWriter<TransactionInfo>(TransactionInfo.class);

TransactionInfo t1 = getTransaction();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BinaryEncoder becoder = EncoderFactory.get().binaryEncoder(baos, null);
eventDatumWriter.setSchema(t1.getSchema());
eventDatumWriter.write(t1, becoder);
becoder.flush();