https://blog.csdn.net/qq_31381053/article/details/109811395
avro
背景
avro是hadoop中的一个子项目,是一个基于二进制数据传输高性能的中间件。
avro支持本地和远程(RPC)调用。基于Http协议的avro远程调用,首先需要定义一个JSON文件作为双方通信的传输协议规范。
序列化就是要把对象转换为字节流,所以需要一个schema定义每个字段的类型,因为不同的字段类型所占用的字节流是不一样的,反序列化的时候同样需要定义这样一个schema,从而从字节流中正确的反序列化为对象,就像json,转对象的时候,必须提供一个class类型,才能知道这个字符串要转成哪个对象
特点
丰富的数据结构
紧凑、快速的二进制数据格式
远程过程调用
简单的动态语言集成
avro vs json
json是一种轻量级的数据传输格式,但对于大数据集,json数据会显得力不从心。json的格式是key:value型,每条记录都需要附上key的名字,对空间浪费十分严重。对于大数据集来说,因为json不够紧凑,且还要加上重复的key信息,不仅会造成存储空间上的浪费,也增加了数据传输的压力,从而影响了整个集群的吞吐量。
采用avro可以比较好地解决此问题。avro序列化后地文件由schema和内容组成。schema为数据地元数据,单独存放在一个JSON文件中,这样一来,数据地元数据只存了一次,相比JSON数据格式地文件,大大缩小了存储容量,也减少了传输带宽。
schema
avro的schema用json表示。schema定义了简单数据类型和复杂数据类型。
基本类型
基本类型没有属性,例如:{“type”: “string”}
类型 含义
null 空值
boolean 布尔值
int 32位有符号整数
long 64位有符号整数
float 单精度浮点数
double 双精度浮点数
bytes 8位无符号字节序列
string 字符串
复杂类型
avro提供了6种复杂类型:record,enum,array,map,union和fixed。
Record
{
"type": "record",
"name": "LongList",
"aliases": ["LinkedLongs"], // old name for this
"fields" : [
{"name": "value", "type": "long"}, // each element has a long
{"name": "next", "type": ["null", "LongList"]} // optional next element
]
}
1
2
3
4
5
6
7
8
9
name:字段名字(必填)
doc:字段说明文档(可选)
type:一个schema的json对象或者一个类型名字(必填)
default:默认值(可选)
order:排序(可选),只有3个值ascending(默认),descending或ignore
aliases:别名,字符串数组(可选)
Enum
{ "type": "enum",
"name": "Suit",
"symbols" : ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]
}
1
2
3
4
name:枚举类型的名字(必填)
namespace:命名空间(可选)
aliases:字符串数组,别名(可选)
doc:说明文档(可选)
symbols:字符串数组,所有的枚举值(必填),不允许重复数据。
Array
{"type": "array", "items": "string"}
1
items:数组元素的schema
Map
{"type": "map", "values": "long"}
1
Map类型的类型名字是”map”并且只支持一个属性:
values:map值的schema
Map的key必须是字符串。
Union
组合类型,表示各种类型的组合,使用数组进行组合。比如[“null”, “string”]表示类型可以为null或者string。
组合类型的默认值是看组合类型的第一个元素,因此如果一个组合类型包括null类型,那么null类型一般都会放在第一个位置,这样子的话这个组合类型的默认值就是null。
组合类型中不允许同一种类型的元素的个数不会超过1个,除了record,fixed和enum。比如组合类中有2个array类型或者2个map类型,这是不允许的。
组合类型不允许嵌套组合类型。
Fixed
{"type": "fixed", "size": 16, "name": "md5"}
1
混合类型的类型名字是fixed,支持以下属性:
name:名字(必填)
namespace:命名空间(可选)
aliases:字符串数组,别名(可选)
size:一个整数,表示每个值的字节数(必填)