AVRO : 常用知识总结

原创 2017年01月03日 16:11:56

AVRO介绍说明

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

  1. Avro依赖于模式(Schema)。Avro数据的读写操作是很频繁的,而这些操作都需要使用模式,这样就减少写入每个数据资料的开销,使得序列化快速而又轻巧。这种数据及其模式的自我描述方便于动态脚本语言的使用。
    当Avro数据存储到文件中时,它的模式也随之存储,这样任何程序都可以对文件进行处理。如果需要以不同的模式读取数据,这也很容易解决,因为两个模式都是已知的。

  2. 当在RPC中使用Avro时,服务器和客户端可以在握手连接时交换模式。服务器和客户端有着彼此全部的模式,因此相同命名字段、缺失字段和多余字段等信息之间通信中需要解决的一致性问题就可以容易解决
    还有,Avro模式是用JSON(一种轻量级的数据交换模式)定义的,这样对于已经拥有JSON库的语言可以容易实现。

  3. Avro提供着与诸如Thrift和Protocol Buffers等系统相似的功能,但是在一些基础方面还是有区别的,主要是:
    1 动态类型:Avro并不需要生成代码,模式和数据存放在一起,而模式使得整个数据的处理过程并不生成代码、静态数据类型等等。这方便了数据处理系统和语言的构造。
    2 未标记的数据:由于读取数据的时候模式是已知的,那么需要和数据一起编码的类型信息就很少了,这样序列化的规模也就小了。
    3 不需要用户指定字段号:即使模式改变,处理数据时新旧模式都是已知的,所以通过使用字段名称可以解决差异问题。

Avro Data Types And Schemas


从mapred中创建一个简单的Avro输出文件

*.avsc AVRO模式文件(Schema File)

比如说创建一个user.avsc,放在资源文件目录下 src/main/avro
maven 设置 ,版本号是可变的

<plugin>
        <groupId>org.apache.avro</groupId>
        <artifactId>avro-maven-plugin</artifactId>
        <version>1.8.1</version>
        <executions>
          <execution>
            <phase>generate-sources</phase>
            <goals>
              <goal>schema</goal>
            </goals>
            <configuration>
              <sourceDirectory>${project.basedir}/src/main/resources/avro/</sourceDirectory>//avro模式文件
              <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>//生成的java文件
            </configuration>
          </execution>
        </executions>
      </plugin>
{"namespace": "com.kbl.airline.avro",
  "type": "record",
  "name": "User",
  "fields": [
    {"name": "name", "type": "string"},
    {"name": "favorite_number",  "type": ["int", "null"]},
    {"name": "favorite_color", "type": ["string", "null"]}
  ]
}

这样在编译之后就会在com.kbl.airline.avro包下生成User类


在mapper端使用作为输出

//使mapper的输出设置为AVRO格式的
public static class AvroMapper extends Mapper<LongWritable,Text,AvroKey<NullWritable>,AvroValue<Users>> {
    Users.Builder fd = Users.newBuilder();
    ...
    ...//相关字段set方法赋值
    context.write(new AvroKey<NullWritable>(NullWritable.get()),new AvroValue<Users>(fd.build()));//写出

//job的设置
job.setOutputFormatClass(AvroKeyValueOutputFormat.class);

job.setOutputKeyClass(AvroKey.class);
job.setOutputValueClass(AvroValue.class);

job.setMapperClass(AvroMapper.class);
AvroJob.setOutputKeySchema(job, Schema.create(Schema.Type.NULL));
AvroJob.setOutputValueSchema(job,FlightDelays.SCHEMA$);

}

在mapper端使用作为输入

//mapper
public static class AvroMapper2 extends Mapper<AvroKey<NullWritable>,AvroValue<FlightDelays>,NullWritable,Text> {
    FlightDelays fd = value.datum();//转换为对象,可直接通过get方法获取属性
        context.write(NullWritable.get(),new Text(fd.getYear().toString()));
}

//job 的设置
job.setInputFormatClass(AvroKeyValueInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);

job.setMapperClass(AvroMapper2.class);
AvroJob.setInputKeySchema(job, Schema.create(Schema.Type.NULL));
AvroJob.setInputValueSchema(job,FlightDelays.SCHEMA$);

参考文献:
1. 百度百科
2. avro 官网
3. 深入理解Hadoop第二版

版权声明:本文为博主原创文章,未经博主允许不得转载。

Apache Avro 1.8.1 入门指南(Java)

Apache Avro是一个数据序列化系统。序列化就是将对象转换成二进制流,相应的反序列化就是将二进制流再转换成对应的对象。因此,Avro就是用来在传输数据之前,将对象转换成二进制流,然后此二进制流达...
  • strongyoung88
  • strongyoung88
  • 2016年12月23日 15:33
  • 1476

Apache Avro 入门

Avro是一个基于二进制数据传输高性能的中间件。 Avro支持本地和远程RPC(Ref)调用,RPC远程调用又分为Http和Netty2种,在这里主要介绍基于Http协议的Avro远程调用,首先需要定...
  • tianwei7518
  • tianwei7518
  • 2015年03月03日 20:11
  • 7099

Avro基础

一、Avro的基本功能 1、定义了数据模式文件的语法,一般使用json文件。以及一些数据基本类型与复杂类型。 2、定义了数据序列化到文件后的数据格式,此格式可供各种语言进行读取。 3、为部分语言...
  • jinhong_lu
  • jinhong_lu
  • 2015年06月16日 16:01
  • 246

AVRO 规范-Schema的定义和声明

参考自http://avro.apache.org/docs/current/spec.html Avro 1.4.1规范定义了Avro序列化系统,它即将成为官方规范,Avro的各种实现方式必须遵循...
  • u013494310
  • u013494310
  • 2014年05月21日 06:42
  • 1044

JSON与AVRO数据文件的相互转换

JSON是一种常用的数据交换格式,很多系统都会使用JSON作为数据接口返回的数据格式,然而,由于JSON数据中包含大量的字段名字,导致空间的严重浪费,尤其是数据文件较大的时候,而AVRO是一种更加紧凑...
  • strongyoung88
  • strongyoung88
  • 2017年01月09日 21:36
  • 3093

Flume-ng:avro源发送日志

agent3 配置 agent3.channels.ch1.type = memory agent3.sources.avro-source1.channels = ch1 agent3.sou...
  • lskyne
  • lskyne
  • 2014年07月09日 16:28
  • 8374

Apache Avro 与 Thrift 比较

http://www.tbdata.org/archives/1307 pache Avro 与 Thrift 比较 Avro和Thrift都是跨语言,基于二进制的高性能的通讯中间...
  • sony315
  • sony315
  • 2011年10月19日 11:57
  • 23065

Avro简介

最近在研究Thrift和Avro以及它们的区别,通过各种渠道搜集资料,现整理出有关Avro的一些资料,方便以后参考。 一、引言 1、 简介 Avro是Hadoop中的一个子项目,也是Apac...
  • xyw_Eliot
  • xyw_Eliot
  • 2013年05月23日 21:18
  • 8187

Avro:入门例子

Avro是由Hadoop创始人Doug Cutting创建的一种语言无关的数据序列化和RPC框架,用于解决Hadoop中Writable序列化机制的缺点:缺少跨语言特性,与Java绑的太紧,数据格式很...
  • bingduanlbd
  • bingduanlbd
  • 2016年07月23日 22:35
  • 1387

Avro (数据序列化) 基础概念

数据序列化的系统。 新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制。...
  • ronmy
  • ronmy
  • 2017年03月05日 14:03
  • 316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AVRO : 常用知识总结
举报原因:
原因补充:

(最多只允许输入30个字)