您当前的位置: 首页 >  vr

梁云亮

暂无认证

  • 1浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Avro简介

梁云亮 发布时间:2020-02-09 21:35:44 ,浏览量:1

Avro简介

Avro是Hadoop的一个子项目,由Hadoop的创始人Doug Cutting(也是Lucene,Nutch等项目的创始人)牵头开发。

Avro是一个数据序列化系统,它的主要特点有:

  • 提供了丰富的数据结构
  • 提供容器文件,用于存储持久化数据(可以作缓冲用)
  • 远程过程调用(RPC)
  • 生成的序列化文件比较紧凑,并且支持二进制序列化枨式,可以便捷快速地处理大量数据
  • 动态语言集成功能,该功能使动态语言可以方便地处理Avro数据。Avro 和动态语言结合后,读写数据文件和使用 RPC 协议都不需要生成代码,也不需要使用或实现RPC协议。代码生成作为一种可选的优化,只在为静态类型语言的集成中实现。

Avro提供的功能类似于Thrift, Protocol Buffer等系统。Avro在以下基本方面与这些系统不同:

  • 动态类型:Avro不需要生成代码。数据始终伴随着一个schema,该schema允许对数据进行全面处理而无需代码生成,静态数据类型等。这有助于构建通用数据处理系统和语言。
  • 未标记的数据:由于在读取数据时存在schema,因此需要用数据编码的类型信息少得多,因些序列化的内容相对比较小。
  • 没有手动分配的字段ID:当模式更改时,在处理数据时,旧模式和新模式都始终存在,因此可以使用字段名称以符号方式解决差异。
Avro数据类型

Avro的Schema定义了简单数据类型和复杂数据类型两种:

简单数据类型

简单数据类型有以下8种:

类型含义null没有值boolean布尔值int32位有符号整数long64位有符号整数float单精度(32位)的IEEE 754浮点数double双精度(64位)的IEEE 754浮点数bytes8位无符号字节序列string字符串

基本类型没有属性,基本类型的名字也就是类型的名字,比如: {“type”: “int”}

复杂类型

Avro提供了Record,Enum,Array,Map,Union和Fixed 6种复杂类型:

Record

Record类型的名字是 “record”,类似于Java中的对象,它支持的属性有:

  • name:record类型的名字(必填)
  • namespace:命名空间(可选)
  • doc:该类型的文档说明(可选)
  • aliases:record类型的别名,它是字符串数组(可选)
  • fields:record类型中的字段,是个对象数组(必填)。每个字段需要以下属性:
    • name:字段名字(必填)
    • doc:字段说明文档(可选)
    • type:一个schema的json对象或者一个类型名字(必填)
    • default:默认值(可选)
    • order:排序(可选),只有3个值ascending(升序、默认),descending或ignore
    • aliases:别名,字符串数组(可选)

示例:定义一个元素类型是Long的链表:

{
  "type": "record", 
  "name": "LongList",
  "aliases": ["LinkedLongs"],                      // old name for this
  "fields" : [
    {"name": "value", "type": "long"},             // each element has a long
    {"name": "next", "type": ["null", "LongList"]} // optional next element
  ]
}
Enum

枚举类型的名字是”enum”,它支持的属性的有:

  • name:枚举类型的名字(必填)
  • namespace:命名空间(可选)
  • aliases:字符串数组,别名(可选)
  • doc:说明文档(可选)
  • symbols:字符串数组,所有的枚举值(必填),不允许重复数据。

示例:

{ "type": "enum",
  "name": "Season",
  "symbols" : ["Spring", "Summer", "autumn", "Winter"]
}
Array

数组类型的名字是”array”,它只支持如下所示的一个属性:

  • items:数组元素的schema

示例:

{"type": "array", "items": "string"}
Map

Map类型的名字是”map”,它只支持如下所示的一个属性:

  • values:map值的schema

示例:

{"type": "map", "values": "long"}

注意:Map的key必须是字符串。

Union

组合类型的名字是Union,它表示各种类型的组合,类似于C语言中的结构体,使用数组进行组合。比如[“null”, “int”],表示类型可以为null或者int。 组合类型的默认值是组合类型的第一个元素,因此如果一个组合类型包括null类型,那么null类型一般都会放在第一个位置,这样子的话这个组合类型的默认值就是null。 组合类型中不允许同一种类型的元素的个数超过一个,除了record,fixed和enum。比如组合类中有2个array类型或者2个map类型,这是不允许的。 组合类型不允许嵌套组合类型。

Fixed

混合类型的名字是fixed,它支持以下属性:

  • name:名字(必填)
  • namespace:命名空间(可选)
  • aliases:字符串数组,别名(可选)
  • size:一个整数,表示每个值的字节数(必填)

示例:8个字节数的fixed类型:

{"type": "fixed", "size": 8, "name": "demo"}
Schema

Avro在序列化时依赖模式文件(schema),当Avro读取数据和写入数据时,都需要提供模式文件。这样Avro就可以预先知道数据的类型,不用对数据进行预先检测而可以写入每个数据,从而使序列化既快又小。由于数据及其模式是完全自描述的,因此也便于使用动态脚本语言。

Avro依赖模式(Schema)来实现数据结构定义。可以把模式理解为Java的类,它定义每个实例的结构,可以包含哪些属性。可以根据类来产生任意多个实例对象。对实例序列化操作时必须需要知道它的基本结构,也就需要参考类的信息。这里,根据模式产生的Avro对象类似于类的实例对象。每次序列化/反序列化时都需要知道模式的具体结构。所以,在Avro可用的一些场景下,如文件存储或是网络通信,都需要模式与数据同时存在。Avro数据以模式来读和写(文件或是网络),并且写入的数据都不需要加入其它标识,这样序列化时速度快且结果内容少。由于程序可以直接根据模式来处理数据,所以Avro更适合于脚本语言的发挥。

当Avro数据存储在文件中时,对应的模式信息也会随之存储,因此以后任何程序都可以处理该数据文件。如果读取数据的程序期望使用其他模式,则由于这两种模式文件的存在,因此可以轻松解决。

Avro模式是使用JSON定义的 。这有助于以已经具有JSON库的语言实现。 模式文件一般以.avsc结尾(maven插件会去指定目录下获取.avsc结尾的文件并生成成java文件)

示例1:

{
"namespace":"com.hc.bean",
"type":"record",
"name":"Dept",
"fields":[
  {"name":"deptno","type":"int"},
  {"name":"dname","type":"string"},
  {"name":"loc","type":["null","string"]}
]
}

示例2:

{"namespace": "com.hc.bean", 
 "type": "record", 
 "name": "avroBean", 
 "fields": [ 
   {"name": "stringVar", "type": "string"}, 
   {"name": "bytesVar", "type": ["bytes", "null"]}, 
   {"name": "booleanVar",  "type": "boolean"}, 
   {"name": "intVar",  "type": "int", "order":"descending"}, 
   {"name": "longVar",  "type": ["long", "null"], "order":"ascending"}, 
   {"name": "floatVar",  "type": "float"}, 
   {"name": "doubleVar",  "type": "double"}, 
   {"name": "enumVar",  "type": {"type": "enum", "name": "Suit", "symbols" : ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]}}, 
   {"name": "strArrayVar", "type": {"type": "array", "items": "string"}}, 
   {"name": "intArrayVar", "type": {"type": "array", "items": "int"}}, 
   {"name": "mapVar", "type": {"type": "map", "values": "long"}}, 
   {"name": "fixedVar", "type": {"type": "fixed", "size": 16, "name": "md5"}} 
 ] 
}
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0427s