当前市场上有很多类似的序列化系统,如Google的Protocol Buffers, Facebook的Thrift。
它的主要特点有:支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据。
Hadoop现存的RPC系统遇到一些问题,如性能瓶颈(当前采用IPC系统,它使用Java自带的DataOutputStream和DataInputStream);需要服务器端和客户端必须运行相同版本的Hadoop;只能使用Java开发等。
1.AVRO简介
avro有四种数据形式[json, datum, container, trevni]。trevni就是parquet的前身,面向列存储,也继承了trevni的使命。如果说avro datum面向于通讯及实时, avro container面向于数据交换存储, avro trevni就是面向于数据计算。apache parquet成功继承avro trevni,致力于作为数据计算的标准存储格式,目前也被apache flink/apache spark作为批量计算的核心格式,当然实时计算被avro牢牢把控。
批量计算存储分切成了两块,apache parquet与apache arrow。apache parquet是物理存储形式,apache arrow是基于flatbuffer的内存数据格式,无缝迅猛对接各大平台的数据格式转换器。
目前大数据的生态,基本上就是: apache avro(实时,数据交换) + apache parquet(批量) + apache arrow(内存)的三大格局。当然还有我没有提到的ORC存储,本质上是apache parquet的可选方案,发展似乎更加缓慢一点。
2.不同编码的空间性能
大部分人对json数据格式都有较强的认知。但是json的缺点是很明显的,它的schema每条记录都要带上,数据是文本形式很浪费空间,无法强制约束数据格式,数据类型扩展性较弱,对于数据模式检验有一定的json schema标准支持。
那么,如果我们把schema单独提出来,对数据类型进行高效编码,那么每条数据是不是空间最省性能最高呢?
3.avro-tools相关操作
avro-tools是操作avro文件格式的命令,源码为:https://github.com/apache/avro/tree/master/lang/java/tools。
avro-tools基本功能如下图所示:
常用的使用场景有:
(1)场景一:json与avro datum格式互相转换。
avro-tools jsontofrag --schema schema/XXX.avsc sample/XXX.json
cat xxx.avro | avro-tools fragtojson --schema-file schema/XXX.avsc
(2)场景二:json与avro container格式互相转换。
avro-tools fromjson --codec snappy --schema-file schema/XXX.avsc
avro-tools tojson xxx.avro
avro-tools getschema xxx.avro
(3)场景三:编码text文件转换成avro压缩格式
avro-tools fromtext ...
avro-tools totext …