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
相关推荐
NULL 博文链接:https://fengyilin.iteye.com/blog/2345324
Apache Avro™ is a data serialization system. To learn more about Avro, please read the current documentation. To download Avro, please visit the releases page. Developers interested in getting more ...
什么是Apache Avro? 来自:“ Avro是数据序列化系统” Avro提供: 丰富的数据结构。 一种紧凑,快速的二进制数据格式。 容器文件,用于存储持久性数据。 远程过程调用(RPC)。 与动态语言的简单集成。 读取或写入...
NULL 博文链接:https://chengjianxiaoxue.iteye.com/blog/2176797
avsc 是 Apache Avro 的纯 JavaScript 实现。特性:完整的 Avro 架构支持,包括递归架构, sort order, 以及 schema evolution.快速!速度相当于 JSON 的两倍,同时更少的编码(varies per schema).无依赖, avsc 甚至...
平均行动RPC与Apache Avro示例。
Maven坐标:org.apache.avro:avro:1.11.0; 标签:apache、avro、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
“ avro-rpc-demo”是Java实现的avro rpc的演示代码。 作者:zhexin Pan日期:20151103 简介此项目包括Java中的三个实现演示。 第一个是官方网站的快速入门演示,它是数据序列化和反序列化的两种实现,分别称为...
一个示例应用程序,展示了如何使用出色的Apache Avro序列化程序以及实际使用的Avro RPC。 Avro RPC使用下面的Avro序列化器,但也允许客户端方法快速便捷地执行RPC等服务器方法。 RPC参数作为Avro序列化对象通过网络...
avro-example ## 示例:使用 Java 的 Apache Avro Apache Avro:trade_mark: 是一个数据序列化系统。 这是一个简短的练习,用于举例说明如何使用 Java 来使用 Apache Avro:trade_mark:。 文档:
运行Sqoop报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/LogicalType,下载此资源放到Sqoop的lib目录下即可
Maven坐标:org.apache.avro:avro:1.10.0; 标签:apache、avro、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
HARPC(High Availability RPC)是基于Thrift的跨语言、高可用的RPC框架。具备高性能、高可用、轻量级等特点 * 跨语言通信 * 方便的使Java、Python、C++三种程序可以相互通信 * 负载均衡和容灾处理 * 方便的实现...
Avro RPC示例源码,包括client与server端,底层采用Netty
Apache Avro模式工具用于Tarantool的模式工具,从零开始在Lua中实现。 显着特点: Avro默认值; Avro别名; 由于运行时代码生成,数据转换速度很快; 扩展,例如内置的可为空的类型。avro_schema = require ( ' avro...
test_avro 使用 jetty 和 apache avro 进行 Spring Boot 概念验证 使用 jetty 运行 spring boot 项目: mvn spring-boot: run Avro 的概念证明在测试中,所以使用:mvn test 结尾。-
适用于Golang的Apache Avro 请注意,该项目仍处于早期测试阶段,可能会随时更改。 安装很简单,如下所示: go get github.com/elodina/go-avro 一些用法示例位于: go-avro现在还支持从Avro模式生成代码,该模式...
Maven坐标:org.apache.avro:avro:1.8.2; 标签:apache、avro、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
Maven坐标:org.apache.avro:avro:1.8.2; 标签:apache、avro、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...