一、Avro:
1、简介
Avro是Hadoop中的一个子项目,也是Apache中一个独立的项目, Avro是一个数据序列化的系统。Avro 可以将数据结构或对象转化成便于存储或传输的格式。Avro设计之初就用来支持数据密集型应用,适合于远程或本地大规模数据的存储和交换。
2、特点
Avro依赖于模式(Schema)。通过模式定义各种数据结构,只有确定了模式才能对数据进行解释,所以在数据的序列化和反序列化之前,必须先确定模式的结构。正是模式的引入,使得数据具有了自描述的功能,同时能够实现动态加载,另外与其他的数据序列化系统如Thrift相比,数据之间不存在其他的任何标识,有利于提高数据处理的效率。
Avro的模式主要由JSON对象来表示,Avro支持8种基本类型(Primitive Type)和6种复杂类型(ComplexType:records、enums、arrays、maps、unions 和fixed),基本类型可以由JSON字符串来表示。
Avro支持两种序列化编码方式:二进制编码和JSON编码,使用二进制编码会高效序列化,并且序列化后得到的结果会比较小。
Avro和动态语言结合后,读/写数据文件和使用RPC协议都不需要生成代码,而代码生成作为一种可选的优化只需要在静态类型语言中实现。
3、与Thrift, Protocol buffer区别在几方面:
1.Dynamic typing: 不必需生成中间代码(生成代码只是优化选项)
2.Untagged data: 因为schema已经有了,所以数据中只需较少类型信息.
3.No mannually-assigned field ids:因为schema是按field name描述的,不是按field id描述
4、经过实际测试,发现AVRO能够支持多种语言的序列化和反序列化,但是支持的RPC实现语言目前只包括三类:Java,python,ruby,对于c,c#,c++等目前还没有提供Rpc的实现。
以Java为例说明RPC实现流程:
对于协议文件:重点是要定义自定义数据格式和客户端与服务端的消息格式message
{
"namespace":"avro",//命名空间
"doc":"This is a message.",//对协议的描叙
"protocol":"messageProtocol",
"name":"HelloWorld",
"types":[
{//定义一个数据类型
"name":"responseType",
"type":"record",
"fields":[ {"name":"responseName", "type":"string"} ]
}
],
"messages":{
"message1":{
"doc":"the standardmessage ",
"request":[{"name":"request", "type":"requestType"}],//请求类型
"response":"responseType"//方法返回的数据类型为responseType
}
}
type可定义的参考类型:
avro type jsontype example
null null null
boolean boolean true
int,long integer 1
float,double number 1.1
bytes string "\u00FF"
string string "foo"