`
MyEyeOfJava
  • 浏览: 1157195 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:71352
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

[Hadoop]转载-avro数据序列化简介

 
阅读更多
Avro(读音类似于[ævrə])是Hadoop的一个子项目,由Hadoop的创始人Doug Cutting(也是Lucene,Nutch等项目的创始人,膜拜)牵头开发,当前最新版本1.3.3。Avro是一个数据序列化系统,设计用于支持大批量数据交换的应用。它的主要特点有:支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据。

     当前市场上有很多类似的序列化系统,如Google的Protocol Buffers, Facebook的Thrift。这些系统反响良好,完全可以满足普通应用的需求。针对重复开发的疑惑,Doug Cutting撰文解释道:Hadoop现存的RPC系统遇到一些问题,如性能瓶颈(当前采用IPC系统,它使用Java自带的DataOutputStream和DataInputStream);需要服务器端和客户端必须运行相同版本的Hadoop;只能使用Java开发等。但现存的这些序列化系统自身也有毛病,以Protocol Buffers为例,它需要用户先定义数据结构,然后根据这个数据结构生成代码,再组装数据。如果需要操作多个数据源的数据集,那么需要定义多套数据结构并重复执行多次上面的流程,这样就不能对任意数据集做统一处理。其次,对于Hadoop中Hive和Pig这样的脚本系统来说,使用代码生成是不合理的。并且Protocol Buffers在序列化时考虑到数据定义与数据可能不完全匹配,在数据中添加注解,这会让数据变得庞大并拖慢处理速度。其它序列化系统有如Protocol Buffers类似的问题。所以为了Hadoop的前途考虑,Doug Cutting主导开发一套全新的序列化系统,这就是Avro,于09年加入Hadoop项目族中。

     上面通过与Protocol Buffers的对比,大致清楚了Avro的特长。下面着重关注Avro的细节部分。

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

     Avro的模式主要由JSON对象来表示,它可能会有一些特定的属性,用来描述某种类型(Type)的不同形式。Avro支持八种基本类型(Primitive Type)和六种混合类型(Complex Type)。基本类型可以由JSON字符串来表示。每种不同的混合类型有不同的属性(Attribute)来定义,有些属性是必须的,有些是可选的,如果需要的话,可以用JSON数组来存放多个JSON对象定义。在这几种Avro定义的类型的支持下,可以由用户来创造出丰富的数据结构来,支持用户纷繁复杂的数据。

     Avro支持两种序列化编码方式:二进制编码和JSON编码。使用二进制编码会高效序列化,并且序列化后得到的结果会比较小;而JSON一般用于调试系统或是基于WEB的应用。对Avro数据序列化/反序列化时都需要对模式以深度优先(Depth-First),从左到右(Left-to-Right)的遍历顺序来执行。基本类型的序列化容易解决,混合类型的序列化会有很多不同规则。对于基本类型和混合类型的二进制编码在文档中规定,按照模式的解析顺序依次排列字节。对于JSON编码,联合类型(Union Type)就与其它混合类型表现不一致。

     Avro为了便于MapReduce的处理定义了一种容器文件格式(Container File Format)。这样的文件中只能有一种模式,所有需要存入这个文件的对象都需要按照这种模式以二进制编码的形式写入。对象在文件中以块(Block)来组织,并且这些对象都是可以被压缩的。块和块之间会存在同步标记符(Synchronization Marker),以便MapReduce方便地切割文件用于处理。下图是根据文档描述画出的文件结构图:
  
     上图已经对各块做肢解操作,但还是有必要再详细说明下。一个存储文件由两部分组成:头信息(Header)和数据块(Data Block)。而头信息又由三部分构成:四个字节的前缀(类似于Magic Number),文件Meta-data信息和随机生成的16字节同步标记符。这里的Meta-data信息让人有些疑惑,它除了文件的模式外,还能包含什么。文档中指出当前Avro认定的就两个Meta-data:schema和codec。这里的codec表示对后面的文件数据块(File Data Block)采用何种压缩方式。Avro的实现都需要支持下面两种压缩方式:null(不压缩)和deflate(使用Deflate算法压缩数据块)。除了文档中认定的两种Meta-data,用户还可以自定义适用于自己的Meta-data。这里用long型来表示有多少个Meta-data数据对,也是让用户在实际应用中可以定义足够的Meta-data信息。对于每对Meta-data信息,都有一个string型的key(需要以“avro.”为前缀)和二进制编码后的value。对于文件中头信息之后的每个数据块,有这样的结构:一个long值记录当前块有多少个对象,一个long值用于记录当前块经过压缩后的字节数,真正的序列化对象和16字节长度的同步标记符。由于对象可以组织成不同的块,使用时就可以不经过反序列化而对某个数据块进行操作。还可以由数据块数,对象数和同步标记符来定位损坏的块以确保数据完整性。
  
     上面是将Avro对象序列化到文件的操作。与之相应的,Avro也被作为一种RPC框架来使用。客户端希望同服务器端交互时,就需要交换双方通信的协议,它类似于模式,需要双方来定义,在Avro中被称为消息(Message)。通信双方都必须保持这种协议,以便于解析从对方发送过来的数据,这也就是传说中的握手阶段。
 
     消息从客户端发送到服务器端需要经过传输层(Transport Layer),它发送消息并接收服务器端的响应。到达传输层的数据就是二进制数据。通常以HTTP作为传输模型,数据以POST方式发送到对方去。在Avro中,它的消息被封装成为一组缓冲区(Buffer),类似于下图的模型:

      

     如上图,每个缓冲区以四个字节开头,中间是多个字节的缓冲数据,最后以一个空缓冲区结尾。这种机制的好处在于,发送端在发送数据时可以很方便地组装不同数据源的数据,接收方也可以将数据存入不同的存储区。还有,当往缓冲区中写数据时,大对象可以独占一个缓冲区,而不是与其它小对象混合存放,便于接收方方便地读取大对象。

     下面聊下Avro的其它方面信息。前文中引述Doug Cutting的话说,Protocol Buffer在传输数据时,往数据中加入注释(annotation),以应对数据结构与数据不匹配的问题。但直接导致数据量变大,解析困难等缺点。那Avro是如何应对模式与数据的不同呢?为了保证Avro的高效,假定模式至少大部分是匹配的,然后定义一些验证规则,如果在规则满足的前提下,做数据验证。如果模式不匹配就会报错。相同模式,交互数据时,如果数据中缺少某个域(field),用规范中的默认值设置;如果数据中多了些与模式不匹配的数据。则忽视这些值。

     Avro列出的优点中还有一项是:可排序的。就是说,一种语言支持的Avro程序在序列化数据后,可由其它语言的Avro程序对未反序列化的数据排序。我不知道这种机制是在什么样的场景下使用,但看起来还是挺不错的。

     当前关于Avro的资料挺少的,上面的文章也是我由官方文档和作者的文章来总结的。我相信其中肯定有很多错误,或许有些方面根本就理解错了。现在放出这篇总结,便于不断修订和补充,也是对这两天学习成果的分享,希望对想了解Avro的人有些许帮助,更希望大家指证我理解错误的地方,利于提高。




   其它资料:
   Avro规范:http://avro.apache.org/docs/current/spec.html
   Doug Cutting文章:http://www.cloudera.com/blog/2009/11/avro-a-new-format-for-data-interchange/
   各序列化系统性能比较:http://wiki.github.com/eishay/jvm-serializers/


   文章出处:http://langyu.iteye.com/blog/708568
分享到:
评论

相关推荐

    Hadoop大数据零基础实战培训教程- Avro数据序列化系统(1)

    Hadoop 是一个能够对大量数据进行分布式处理的软件框架。但是 Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对...

    Apache Hadoop---Avro.docx

    Apache Hadoop 中的 Avro 是一个强大的数据序列化系统,主要设计用于支持大规模数据交换,尤其是在分布式计算环境中。Avro 的核心特性包括高效的二进制序列化方式和对动态语言的良好支持,使得不同编程语言之间的...

    Hadoop大数据零基础实战培训教程-Avro数据序列化系统(2)

    Hadoop 是一个能够对大量数据进行分布式处理的软件框架。但是 Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对...

    Avro数据序列化系统(1)

    Avro是Apache Hadoop项目的一部分,它是一种高效的数据序列化系统,被广泛应用于大数据处理和分布式计算领域。作为Hadoop开发基础知识的重要组成部分,理解并掌握Avro对于开发高效率、可扩展的分布式应用至关重要。 ...

    Avro 1.8.2 序列化规范

    从提供的部分内容来看,文档主要介绍了Avro序列化的几个关键方面: #### Schema Declaration(模式声明) - **PrimitiveTypes(基本类型)**:包括null、boolean、int、long、float、double、bytes、string等,其中...

    Hadoop大数据零基础实战培训教程_Avro数据序列化系统.rar

    Hadoop 是一个能够对大量数据进行分布式处理的软件框架。但是 Hadoop 是以一种可靠、高效、可伸缩的方式进行处理的。Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对...

    hadoop-core-0.20.2 源码 hadoop-2.5.1-src.tar.gz 源码 hadoop 源码

    4. **数据存储与序列化**:Hadoop使用`org.apache.hadoop.io`包处理数据的存储和序列化,包括各种基本类型(如IntWritable、Text等)和复杂的可序列化对象(如SequenceFile、Avro等)。 5. **配置管理**:`org....

    fiji-express-avro-lib-0.1.1.zip

    Fiji Express 可能是一个处理或分析图像的工具,而 Avro 是 Apache Hadoop 生态系统中的一个数据序列化系统,用于高效地存储和传输数据。Avro 提供了一种紧凑、快速、面向列的二进制数据格式,适合大数据处理场景。 ...

    Python库 | streammachine-schemas-clickstream-avro-0.2.0.tar.gz

    Avro是Apache Hadoop项目的一部分,是一种数据序列化系统,常用于大数据处理。在这里,Avro被用作数据格式,使得数据能够在不同的系统之间高效、可移植地进行存储和传输。 这个库的主要功能可能包括: 1. **数据...

    avro序列化

    Avro是Apache Hadoop项目中的一个关键组件,它提供了一种高效、跨语言的数据序列化框架。相比Google的Protocol Buffers,Avro在Hadoop生态中有其独特优势和特点。 首先,让我们深入了解什么是Avro。Avro是由Hadoop...

    protobuf/thrift/avro-序列化性能测试工程

    protobuf(Protocol Buffers)、thrift和avro是三种广泛使用的序列化框架,它们在分布式系统、网络通信以及数据存储中扮演着重要角色。这个名为"protobuf/thrift/avro-序列化性能测试工程"的项目专注于对比这三种...

    commons-avro_2.10-0.0.3.zip

    【标题】"commons-avro_2.10-0.0.3.zip" 提供的是Apache Commons Avro的相关版本,这是一个与Apache Hadoop相关的项目,主要处理Avro数据序列化和反序列化的库。Apache Avro是一个数据序列化系统,它设计用于高效地...

    hadoop2.6-api.zip

    5. **Avro API**:Hadoop 2.6还支持Avro数据序列化框架,允许跨语言的数据交换。`org.apache.hadoop.io.avro`包提供了Avro相关的类和接口。 6. **Guava库**:Hadoop依赖Google的Guava库,提供了一组实用工具类,如...

    hadoop-2.7.5-native 包

    4. **Avro库**:Avro是一个数据序列化系统,用于跨语言数据交换。其本地库提供了更高效的序列化和反序列化性能。 5. **Zookeeper库**:Zookeeper是Hadoop生态系统中的协调服务,它的本地库有助于减少与Zookeeper...

    Hadoop序列化机制

    标题中的“Hadoop序列化机制”是指Hadoop生态系统中用于数据传输和存储的数据表示方式,它是Hadoop MapReduce和Hadoop Distributed File System (HDFS)等组件之间交换数据的关键技术。序列化是将对象转化为可存储或...

    hadoop2.73-eclipse开发hbase所需要的所有jar包

    在实际开发过程中,除了基本的JAR依赖,可能还需要根据具体需求添加其他库,例如Hadoop的Avro或Parquet模块,用于数据序列化和存储。同时,为了确保程序的稳定性和兼容性,开发者应当关注Hadoop和HBase的版本匹配,...

    几种序列化的实现方法 java自带, Writable, Avro

    Avro是由Apache Hadoop项目提供的序列化框架,它提供了更高级别的数据描述和序列化能力。Avro使用JSON格式定义数据模式(Schema),使得数据具有语义含义,且跨语言兼容。Avro的序列化数据紧凑且高效,同时支持动态...

    avro-tool工具jar包

    Avro是Apache软件基金会的一个开源项目,它提供了一种数据序列化系统,广泛应用于大数据处理和分布式计算领域。Avro工具jar包是Avro的一部分,主要用于处理Avro格式的数据,包括编译Avro模式,转换数据,以及合并或...

    sql-avro:使用 Spark SQL 读取 Avro 数据的库

    Avro 是 Apache Hadoop 项目的一部分,它提供了一种高效、可移植的数据序列化系统,常用于数据存储和交换。Spark SQL 则是 Apache Spark 的一个模块,用于处理结构化数据,支持多种数据源,包括 JDBC、Parquet、JSON...

    藏经阁-File Format Benchmark - Avro, JSON, ORC, & Parquet.pdf

    JSON 是一种序列化格式,主要用于 HTTP 和 JavaScript,文本格式,schema 与数据集成,行major 格式,支持压缩。 ORC 原本是 Hive 的一部分,后来成为独立的项目,schema 与数据分离,列major 格式,具有丰富的类型...

Global site tag (gtag.js) - Google Analytics