Avro 就是一款适合大数据的序列化框架
概述:是序列化和RPC的框架,开始是Apache Hadoop的子件之一,Avro不只可以用于Hadoop而是可以用于多个场景下的序列化,所以单独形成一个新的组件
www.apache.org ->Projects
序列化:将对象转化为二进制形式用于传输或者是存储
反序列化:
衡量点:
序列化之后的数据量是否庞大,序列化之后产生二进制数据用于存储或者进行传输,产生的数据量越大存储或者传输时间越长
序列化/反序列化本身过程所消耗的时间以及所占用的CPU
序列化之后的数据是否能够跨语言或者跨平台,现在许多项目往往不是靠一门语言完成,而是多门语言来构造的,在异构网络的架构中,需要一个序列化的对象能够被不同的语言进行解析
java中的原生序列化
java中的序列化无法做到结构的重用,导致序列化之后的数据量偏大
java的序列化是将对象转化为字节码,导致序列化之后只能被java反序列化,其他语言解析困难
序列化框架
ProtoBuf Protocal Buffer 协议缓冲 Google
Thrift Facebook 2007年贡献给了Apache
Avro
Avro特点
1:提供了独立于语言的模式文件schema
2:提供了丰富的数据类型,8中简单类型,6中复杂类型
3:支持RPC通信
4:对序列化文件进行压缩
Avro序列化
1:创建MAVEN工程->导入Avro所需要的依赖包
2:修改windows->p->maven->Error/Warnings->ignore
3:新建资源目录src/main/..
4:编写一个.avsc文件,利用文件产生对应的类
{
"namespace":"avro.pojo", 生成的类存储包名
"type":"record",
"name":"Person", 类名
"fields": 属性
[
{"name":"username", "type":"string"},
{"name":"age", "type":"int"},
{"name":"no", "type":"string"}
]
}
选中pom.xml 运行 maven-generate-sources 成功刷新 去掉@Override
5:数据类型
基本类型 null int long boolean string bytes(对应json格式中的字符串) float double
复杂类型 record(表示序列化) fixed enums(枚举类型) arrays maps(映射类型) union()
Person p = Person.newBuilder().setUsername("值")...;
序列化
DatumWriter<Person> dw = new SpecificDatumWriter<Person>(Persion.class); Avro的序列化流
DataFileWriter<Person> drw = new DataFileWriter<Person>(dw); //将person序列化到文件中
dfw.create(schema(表示序列化遵循的格式) p1.getSchema(), new File("a.txt")); 创建文件
dfw.append(p1);
dfw.append(p2);
dfw.close(); 关流
反序列化
DatumReader<Person> dr = new SpecificDatumReader<Person>(Person.class);
//获取一个从文件读取数据的流
DataFileReader<Person> dfr = new DataFileReader<Person>(dr);
dfr提供了以迭代器的方式读取对象的途径
while(dfr.hasNext()){
Person p = dfr.next();
Syso(p);
}
dfr.close();//关流
有点晚了,代码贴上去还要解释,就不贴了。,,ԾㅂԾ,,