序列化:
进程间通信和永久存储
特点:
紧凑
快速
可扩展性
支持互操作,跨语言
java序列化:
ObjectInput(Output)Stream
hadoop的writable:
PersonWritable //java,非跨语言
avro
由hadoop之父doug cutting创建
avro和hadoop序列化比较:
===============================
writable: 不能跨语言
avro: 跨语言,支持语言如下
c/
cpp/
c#/
java/
js/
perl/
php/
py/
py3/
ruby/
1、创建emp.avsc文件,内容如下
{
"namespace": "tutorialspoint.com",
"type": "record",
"name": "Emp",
"fields": [
{"name": "name", "type": "string"},
{"name": "id", "type": "int"},
{"name": "salary", "type": "int"},
{"name": "age", "type": "int"},
{"name": "address", "type": "string"}
]
}
2、将avro-1.8.2.jar和avro-tools-1.8.2.jar文件放在emp.avsc同级目录
3、编译schema文件
java -jar avro-tools-1.8.2.jar compile schema emp.avsc .
4、查看生成文件
tutorialspoint\com\Emp.java文件
内容包括:
构造函数
builder
get && set
串行化和反串行化方法
5、将此文件加载到ide,
1、修改pom文件
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-tools</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
2、新建包,名称tutorialspoint.com
3、将Emp.java文件复制到包内
4、将代码错误解决
6、开始编写串行化代码
@Test
public void testAvroSerial() throws Exception {
Emp e = new Emp();
e.setId(10);
e.setName("tom");
e.setAge(20);
e.setSalary(1000);
e.setAddress("shahe");
//初始化writer
DatumWriter<Emp> dw = new SpecificDatumWriter<Emp>(Emp.class);
//初始化文件写入器
DataFileWriter<Emp> dfw = new DataFileWriter<Emp>(dw);
//开始序列化文件
dfw.create(Emp.SCHEMA$,new File("F:/avro/emp.avro"));
//在序列文件中追加对象
dfw.append(e);
dfw.close();
System.out.println("ok");
}
}
7、测试java、hadoop、avro对1000000个对象串行化速度比对,大小比对
java writable avro
-------------------------------------------------------------
size 4,883kb 23,438kb 13,677kb
serial 3025ms 29410ms 1384ms
8、编写反串行化代码
@Test
public void testAvroDeSerial() throws Exception {
long start = System.currentTimeMillis();
//初始化reader
DatumReader<Emp> dr = new SpecificDatumReader<Emp>(Emp.class);
//初始化文件阅读器
DataFileReader<Emp> dfr = new DataFileReader<Emp>(new File("F:/avro/emp.avro"),dr);
while (dfr.hasNext()){
Emp emp = dfr.next();
//System.out.println(emp.toString());
}
System.out.println(System.currentTimeMillis() - start);
}
9、测试java、hadoop、avro对1000000个对象反串行化速度比对
java writable avro
-------------------------------------------------------------
size 4,883kb 23,438kb 13,677kb
serial 3025ms 29410ms 1384ms 1802ms
deser 3860ms 26232ms 1972ms 1689ms
10、avro通过不生成代码,直接使用schema的方式对对象进行串行化
Google Protobuf
================================
简单高效的串行化技术,由谷歌在2008年公开
支持跨语言:
Java, C++, and Python
C, C#, Erlang, Perl, PHP, Ruby
java - avro - pb(protobuf)
javaBean schema(json) proto
1、创建emp.proto自描述文件(非java文件)
package tutorial;
option java_package = "tutorialspoint.com";
option java_outer_classname = "Emp2";
message Emp {
required int32 id = 1;
required string name = 2;
required int32 age = 3;
required int32 salary = 4;
required string address = 5;
}
2、将emp.proto和protobuf\src\protoc.exe放在同一个文件夹(F:/avro)
3、输入cmd,编译emp.proto
protoc --java_out=. emp.proto
4、将F:\avro\tutorialspoint\com下的Emp2.java放置在idea中,包名tutorialspoint.com