Avro和protobuf序列化
序列化: 进程间通信和永久存储 特点: 紧凑 快速 可扩展性 支持互操作,跨语言 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