`

RPC框架之Apache Avro 简介

阅读更多

 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

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. {  
  2.    "namespace": "cn.slimsmart.avro.demo",  
  3.    "type": "record",  
  4.    "name": "User",  
  5.    "fields": [  
  6.       {  
  7.          "name": "name",  
  8.          "type": "string"  
  9.       },  
  10.       {  
  11.          "name": "age",  
  12.          "type": [  
  13.             "int",  
  14.             "null"  
  15.          ]  
  16.       },  
  17.       {  
  18.          "name": "phone",  
  19.          "type": [  
  20.             "string",  
  21.             "null"  
  22.          ]  
  23.       }  
  24.    ]  
  25. }  

上面的模式是定义了一个用户的记录,在模式定义中,必须包含它的类型(“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

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. package cn.slimsmart.avro.demo;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import org.apache.avro.file.DataFileReader;  
  7. import org.apache.avro.file.DataFileWriter;  
  8. import org.apache.avro.io.DatumReader;  
  9. import org.apache.avro.io.DatumWriter;  
  10. import org.apache.avro.specific.SpecificDatumReader;  
  11. import org.apache.avro.specific.SpecificDatumWriter;  
  12.   
  13. public class Test {  
  14.   
  15.     public static void main(String[] args) {  
  16.         // 3种生成user对象的方法  
  17.         User user1 = new User();  
  18.         user1.setName("张山");  
  19.         user1.setAge(23);  
  20.         user1.setPhone("123456789");  
  21.   
  22.         User user2 = new User("李斯"45"987654321");  
  23.   
  24.         User user3 = User.newBuilder().setName("王二").setAge(57).setPhone("456893256").build();  
  25.   
  26.         // 序列化user到文件中  
  27.         File file = new File("users.avro");  
  28.         DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);  
  29.         DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);  
  30.         try {  
  31.             dataFileWriter.create(user1.getSchema(), new File("src/main/avro/users.avro"));  
  32.             dataFileWriter.append(user1);  
  33.             dataFileWriter.append(user2);  
  34.             dataFileWriter.append(user3);  
  35.             dataFileWriter.flush();  
  36.             dataFileWriter.close();  
  37.         } catch (IOException e) {  
  38.         }  
  39.   
  40.         // 从文件中反序列化对象  
  41.         DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);  
  42.         DataFileReader<User> dataFileReader = null;  
  43.         try {  
  44.             dataFileReader = new DataFileReader<User>(file, userDatumReader);  
  45.         } catch (IOException e) {  
  46.         }  
  47.         User user = null;  
  48.         try {  
  49.             while (dataFileReader.hasNext()) {  
  50.                 user = dataFileReader.next(user);  
  51.                 System.out.println(user);  
  52.             }  
  53.         } catch (IOException e) {  
  54.         }  
  55.     }  
  56. }  

参考:
官方实例:http://avro.apache.org/docs/current/gettingstartedjava.html
http://blog.csdn.net/zhu_tianwei/article/details/44042691

 

分享到:
评论

相关推荐

    Apache Avro RPC简单示例

    NULL 博文链接:https://fengyilin.iteye.com/blog/2345324

    Apache Avro

    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 ...

    avro-rpc-quickstart:Apache Avro RPC快速入门

    什么是Apache Avro? 来自:“ Avro是数据序列化系统” Avro提供: 丰富的数据结构。 一种紧凑,快速的二进制数据格式。 容器文件,用于存储持久性数据。 远程过程调用(RPC)。 与动态语言的简单集成。 读取或写入...

    apache avro 简介

    NULL 博文链接:https://chengjianxiaoxue.iteye.com/blog/2176797

    ApacheAvro纯JavaScript实现avsc.zip

    avsc 是 Apache Avro 的纯 JavaScript 实现。特性:完整的 Avro 架构支持,包括递归架构, sort order, 以及 schema evolution.快速!速度相当于 JSON 的两倍,同时更少的编码(varies per schema).无依赖, avsc 甚至...

    avro-in-action:RPC与Apache Avro示例

    平均行动RPC与Apache Avro示例。

    avro-1.11.0-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro:1.11.0; 标签:apache、avro、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    avro-rpc-demo:avro rpc的演示代码

    “ avro-rpc-demo”是Java实现的avro rpc的演示代码。 作者:zhexin Pan日期:20151103 简介此项目包括Java中的三个实现演示。 第一个是官方网站的快速入门演示,它是数据序列化和反序列化的两种实现,分别称为...

    HelloAvro:一个示例应用程序,展示了如何使用很棒的Apache Avro序列化程序

    一个示例应用程序,展示了如何使用出色的Apache Avro序列化程序以及实际使用的Avro RPC。 Avro RPC使用下面的Avro序列化器,但也允许客户端方法快速便捷地执行RPC等服务器方法。 RPC参数作为Avro序列化对象通过网络...

    avro-example:这是一个简短的练习,用于举例说明使用 Java 使用 Apache Avro:trade_mark:

    avro-example ## 示例:使用 Java 的 Apache Avro Apache Avro:trade_mark: 是一个数据序列化系统。 这是一个简短的练习,用于举例说明如何使用 Java 来使用 Apache Avro:trade_mark:。 文档:

    avro-1.8.1

    运行Sqoop报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/LogicalType,下载此资源放到Sqoop的lib目录下即可

    avro-1.10.0-API文档-中英对照版.zip

    Maven坐标:org.apache.avro:avro:1.10.0; 标签:apache、avro、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    java写非常不错的RPC框架,基于Thrift

    HARPC(High Availability RPC)是基于Thrift的跨语言、高可用的RPC框架。具备高性能、高可用、轻量级等特点 * 跨语言通信 * 方便的使Java、Python、C++三种程序可以相互通信 * 负载均衡和容灾处理 * 方便的实现...

    avro-rpc程序示例

    Avro RPC示例源码,包括client与server端,底层采用Netty

    avro-schema:适用于Tarantool的Apache Avro模式工具

    Apache Avro模式工具用于Tarantool的模式工具,从零开始在Lua中实现。 显着特点: Avro默认值; Avro别名; 由于运行时代码生成,数据转换速度很快; 扩展,例如内置的可为空的类型。avro_schema = require ( ' avro...

    test_avro:在 spring 中使用 apache avro

    test_avro 使用 jetty 和 apache avro 进行 Spring Boot 概念验证 使用 jetty 运行 spring boot 项目: mvn spring-boot: run Avro 的概念证明在测试中,所以使用:mvn test 结尾。-

    go-avro:适用于Golang的Apache Avro

    适用于Golang的Apache Avro 请注意,该项目仍处于早期测试阶段,可能会随时更改。 安装很简单,如下所示: go get github.com/elodina/go-avro 一些用法示例位于: go-avro现在还支持从Avro模式生成代码,该模式...

    avro-1.8.2-API文档-中英对照版.zip

    Maven坐标:org.apache.avro:avro:1.8.2; 标签:apache、avro、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    avro-1.8.2-API文档-中文版.zip

    Maven坐标:org.apache.avro:avro:1.8.2; 标签:apache、avro、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

Global site tag (gtag.js) - Google Analytics