Avro和protobuf序列化

时间:2022-10-15 09:03:50
序列化:
    进程间通信和永久存储

    特点:
        紧凑
        快速
        可扩展性
        支持互操作,跨语言


    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