Hive文件存储格式——AVRO


发布于 2017-04-23 / 29 阅读 / 0 评论 /
Avro是一个数据序列化系统,设计用于支持大批量数据交换的应用。

当前市场上有很多类似的序列化系统,如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 …