序列化框架——Avro


一、什么是Avro?

1. Avro是一种远程过程调用和数据序列化框架,是在Apache的Hadoop项目之内开发的
2. 它使用JSON来定义数据类型和通讯协议,使用压缩二进制格式来序列化数据
3. 它主要用于Hadoop,它可以为持久化数据提供一种序列化格式,并为Hadoop节点间及从客户端程序到Hadoop服务的通讯提供一种电报格式
通过avro,每次进行序列化,根据模式(schema)文件来序列化,可以提高性能

二、特点

1. 丰富的数据结构类型,8种基本数据类型以及6种复杂类型
2. 快速可压缩的二进制形式
3. 提供容器文件用于持久化数据
4. 远程过程调用RPC框架
简单的动态语言结合功能,Avro 和动态语言结合后,读写数据文件和使用 RPC协议都不需要生成代码,而代码生成作为一种可选的优化只值得在静态类型语言中实现。而代码生成作为一种可选的优化只值得在静态类型语言中实现

三、创建maven工程,准备pom.xml文件


         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0

    com.blb
    avro
    0.0.1-SNAPSHOT
    jar

    
        
            org.apache.avro
            avro
            1.8.2
        
        
            org.apache.avro
            avro-tools
            1.8.2
        
        
            org.apache.avro
            avro-maven-plugin
            1.8.2
        
        
            org.apache.avro
            avro-compiler
            1.8.2
        
          
            org.apache.avro
            avro-ipc
            1.8.2
        
    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.1
                
                    
                    1.8 
                    1.8 
                    UTF-8
                

            
            
                org.apache.avro
                avro-maven-plugin
                1.8.2
                
                    
                        generate-sources
                        
                            schema
                        
                        
                            ${project.basedir}/src/main/avro/
                            ${project.basedir}/src/main/java/
                        
                    
                
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
    

四、定义avro的scheme

Avro scheme是通过JSON形式来定义的,一般以.avsc结尾(maven插件会去指定目录下获取.avsc结尾的文件并生成成Java文件)。

4.1 在src/main目录下新建一个avro文件夹

 4.2  在src/main/avro目录下新建一个文件,并保存为User.avsc

{
"namespace":"com.blb",
"type":"record",
"name":"User",
"fields":
[
{"name":"username","type":"string"},
{"name":"age","type":"int"}
]
}

其中
namespace在java项目中翻译成包名
name是类名
fields就是配置的属性
注意:必须配置type为record

4.3  生成类

 

 五、Java读写Avro文件,实现序列化和反序列化

@Test
    public void write() throws Exception{

        User u1 = new User("zp",22);
        User u2 = new User("zhangsan",999);

        DatumWriter dw = new SpecificDatumWriter<>(User.class);
        DataFileWriter dfw = new DataFileWriter<>(dw);
        // 创建底层的文件输出通道 
        // schema - 序列化类的模式
        // path - 文件路径
        dfw.create(u1.getSchema(),new File("d://zp.txt"));
        // 把对象数据写到文件中
        dfw.append(u1);
        dfw.append(u2);
        dfw.close();
    }
@Test
    public void read()throws Exception{
        DatumReader dr = new SpecificDatumReader<>(User.class);
        DataFileReader dfr = new DataFileReader(new File("d://zp.txt"),dr);
        //--通过迭代器,迭代出对象数据
        while(dfr.hasNext()){
            System.out.println(dfr.next());
        }
    }