Avro是Hadoop中的一个子项目,也是Apache中一个独立的项目,Avro是一个基于二进制数据传输高性能的中间件。在Hadoop的其他项目中例如HBase(Ref)和Hive(Ref)的Client端与服务端的数据传输也采用了这个工具,Avro可以做到将数据进行序列化,适用于远程或本地大批量数据交互。在传输的过程中Avro对数据二进制序列化后节约数据存储空间和网络传输带宽。做个比方:有一个100平方的房子,本来能放100件东西,现在期望借助某种手段能让原有面积的房子能存放比原来多150件以上或者更多的东西,就好比数据存放在缓存中,缓存是精贵的,需要充分的利用缓存有限的空间,存放更多的数据。再例如网络带宽的资源是有限的,希望原有的带宽范围能传输比原来高大的数据量流量,特别是针对结构化的数据传输和存储,这就是Avro存在的意义和价值。Avro还可以做到在同一系统中支持多种不同语言,也有点类似Apache的另一个产品:Thrift(Ref),对于Thrift不同的是Avro更加具有灵活性,Avro可以支持对定义的数据结构(Schema)动态加载,利于系统扩展。
使用Avro可以通过2中方式来实现:
1.二进制编码,Avro-specific方式依赖代码(文件)生成特定类,并内嵌JSON Schema;
2.JSON编码,Avro-generic方式通过JSON文件动态加载Schema,不需要编译加载直接就可以处理新的数据源。
我肤浅的认为,两者的区别在于同样的数据大小,在二进制编码下所产生的Avro数据的大小为100个字节,而在JSON编码下产生了450个字节。虽然看起来第1种二进制编码的方式占据一定优势,但是二进制传输最大的问题就是出了 bug 不方便追查,而JSON编码的方式更实用于系统与系统之间的数据通讯。
Avro支持本地和远程RPC(Ref)调用,RPC远程调用又分为Http和Netty2种,在这里主要介绍基于Http协议的Avro远程调用,首先需要定义一个JSON文件作为双方通信的传输协议规范,便于解析从对方发送过来的数据。
在这个协议中可以看做分为3大部分:
1.描述(Protocol Declaration),定义命名空间,协议名称 等。
2.数据类型(types),根据规范中的Primitive和Complex Types数据类型,自己封装一套数据格式。
3.消息(messages),根据自己定义的数据类型,再去定义 a)请求、b)回应、c)异常(可选) 数据格式。
特点:
1.丰富的数据结构类型
2.快速可压缩的二进制数据形式
3.存储持久数据的文件容器
4.远程过程调用(RPC)
5.同动态语言的简单集成。读写数据文件和使用RPC协议都不需要生成代码,而代码生成作为一种可选的优化只值得在静态类型语言中实现。
由于性能高、基本代码少和产出数据量精简等特点,Avro周围展开了众多活动——许多NoSQL实现,包括Hadoop、Cssandra等,都把Avro整合到它们的客户端API和储存功能中。Avro有C, C++, C#, Java, PHP, Python, and Ruby等语言的实现,下面我们以一个实例来说明Avro序列化和反序列化数据。
Avro官网:http://avro.apache.org/
jar下载地址:http://mirror.bit.edu.cn/apache/avro/avro-1.7.7/java/
一、在pom.xml中添加依赖jar包
二、定义模式(Schema)
在avro中,它是用Json格式来定义模式的。模式可以由基础类型(null, boolean, int, long, float, double, bytes, and string)和复制类型(record, enum, array, map, union, and fixed)的数据组成。本文只是定义了一个简单的模式user.avsc
上面的模式是定义了一个用户的记录,在模式定义中,必须包含它的类型(“type”: “record”)、一个名字(“name”: “User”)以及fields。在本例中fields包括了name, age和phone,上面的模式我们还定义了一个命名空间 (“namespace”: “cn.slimsmart.avro.demo”),namespace可以名字一起使用,从而组成模式的全名
(即cn.slimsmart.avro.demo.User)
三、编译模式
Avro可以允许我们根据模式的定义而生成相应的类,一旦我们定义好相关的类,我们程序中就不需要直接使用模式了。可以用avro-tools jar包来生成代码,语法如下:
java -jar $HIVE_HOME/lib/avro-tools-1.7.7.jar
compile schema
<schema file> <destination>
所以,在本例中我们可以这样来使用
java -jar ./avro-tools-1.7.7.jar compile schema user.avsc .
这时候,在当前目录下会生成cn/slimsmart/avro/demo/User.java类
如果你直接用Avro Maven plugin,那么你就不需要手动的编译模式,因为Avro Maven plugin会自动给你编译好。
现在我们已经生成好了一个User.java类,我们就可以用代码生成User,并用avro将它序列化存放到本地文件中,最后我们再将其反序列化。
四、代码实例
Test.java
参考:
官方实例:http://avro.apache.org/docs/current/gettingstartedjava.html
http://blog.csdn.net/zhu_tianwei/article/details/44042691
相关推荐
Apache Avro是一个面向数据序列化的开源框架,由Apache软件基金会开发,主要应用于大数据处理和分布式系统。它提供了高效的、跨语言的数据交换格式和API,特别适合远程过程调用(RPC)以及存储和处理大规模数据集。...
通过Avro的RPC框架,服务端和客户端可以使用相同的schema进行通信,确保数据的正确交换。 ### Avro与Hadoop的关系 在Hadoop生态系统中,Avro通常与HDFS、MapReduce、Pig、Hive等组件结合使用。它提供了对Hadoop友好...
4. **测试用例**:可能有JUnit或其他测试框架的测试类,用于验证Avro数据序列化和RPC功能的正确性。 5. **文档**:可能包括README文件,解释如何运行示例,以及每个示例的目的。 学习这个项目,你将了解如何: - *...
**Avro RPC简介** Avro是Hadoop生态系统中的一个关键组件,由Apache软件基金会开发,主要用作数据序列化系统。它提供了一种高效的、语言无关的、版本化的数据序列化机制,使得不同编程语言之间可以方便地交换数据。...
总之,Apache RPC框架,特别是Apache Thrift,提供了强大且灵活的跨语言服务通信能力。通过理解其服务定义、编译过程、服务实现、客户端调用以及性能优化,开发者可以有效地构建分布式系统中的服务通信层。在实际...
本篇文章将对几种常见的RPC框架进行比较分析,包括Protobuf RPC、Avro和Thrift,探讨它们的特点、优缺点以及适用场景。 1. Protobuf RPC(Protocol Buffers Remote Procedure Call) - **Protobuf** 是Google开发...
高性能的框架会选择高效的序列化算法,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro,以减少数据传输开销。 3. **负载均衡**:在高并发环境下,框架应具备负载均衡能力,通过分配请求到不同的服务器...
框架可能提供了高效的序列化库,如Google的Protobuf或Apache Avro。 4. **线程模型**:为了最大化RDMA的性能,框架可能会采用非阻塞I/O(NIO)或多线程模型,确保CPU资源的有效利用。 5. **错误处理和重试机制**:...
SimpleRPCFramework可能使用Java的内置序列化机制或第三方库如Protocol Buffers、Apache Avro或JSON等来将对象转换为字节流,以便在网络中传输。在接收端,这些字节流再被还原成原来的对象形式。这种转换过程确保了...
AVRO是一种跨语言的序列化框架,用于实现数据序列化以及远程过程调用(RPC)。它是Apache软件基金会旗下的一个项目。AVRO提供了丰富的数据结构类型、快速序列化以及支持动态类型语言和静态类型语言。 数据定义语言...
8. **RPC Support**: Avro还提供了远程过程调用(RPC)框架,允许跨网络的服务间通信,且保持了数据的一致性和效率。 在实际应用中,开发者通常会使用Avro工具生成数据访问类,这些类可以帮助我们将Java对象直接...
Avro 1.8.2版本为Hadoop新型序列化框架规范定义了相关细节,提供了标准化的序列化和反序列化机制,可以用于远程过程调用(RPC)和持久化数据的存储。 ### 标题和描述知识点 标题“Avro 1.8.2 序列化规范”直接指出了...
4. **Protocol Buffers**:Avro支持远程过程调用(RPC),通过定义协议,不同服务可以相互通信。这使得Avro成为构建分布式系统中的有力工具。 5. **Language Agnostic**:Avro提供了多种编程语言的实现,包括Java、...
**Avro**是一个强大的数据序列化框架,最初由Apache Hadoop项目开发。它不仅支持动态语言,还提供了丰富的数据结构和高效的二进制数据格式。Avro在RPC中主要负责数据的序列化与反序列化,确保跨平台的数据一致性。 ...
Thrift和Avro是两种广泛使用的数据序列化和远程过程调用(RPC)框架,它们在分布式系统中扮演着重要角色。本文将详细介绍这两种技术及其关键特性。 首先,让我们了解Thrift。Thrift是由Facebook开发的一种跨语言的...
Apache Thrift 是 Facebook 开源的跨语言服务开发框架,它同样提供了一种数据序列化机制。Thrift 使用接口定义语言(IDL)来描述数据结构和服务接口,然后自动生成不同语言的代码,包括 Java。Thrift 的特点是高性能...
Avro是Apache Hadoop项目的一部分,它是一种数据序列化系统,用于在分布式计算环境中高效地存储和传输数据。Avro提供了丰富的数据模型,包括记录、枚举、数组、映射、固定大小的数据类型以及 unions,使得数据在各种...
avro是Apache Hadoop项目的一部分,设计用于大数据处理。avro提供了一种紧凑、高效的二进制数据格式,同时支持动态类型,使得数据能够在不预先知道数据结构的情况下进行序列化和反序列化。avro的schema同样保存在...
Thrift和Avro是两种广泛使用的数据序列化和远程过程调用(RPC)框架,它们在分布式系统中扮演着重要角色。在这个实例中,我们将深入理解这两种技术,并探讨它们各自的特性和应用场景。 Thrift是由Facebook开发的一...
Apache Avro:trade_mark: 是一个数据序列化系统。 Avro 提供: 丰富的数据结构。 一种紧凑、快速的二进制数据格式。 一个容器文件,用于存储持久数据。 远程过程调用 (RPC)。 与动态语言的简单集成。 代码生成...