apache avro 简介
1 rpc简介:
a) 远程过程调用,本质是不同机器之间socket通讯
b) 具体实现产品:rmi xml-rpc avro-rpc 等,
前两者使用时,实现比较复杂,并且相同数据量下序列化后的数量较大 影响机器之间的传输速度
c) rpc数据序列化在Hadoop圈子中比较出名的两个工具:
apache avro和google的protocol buffer
前者在Hadoop1中使用到, 后者在Hadoop2中使用到
此两者都支持多语言,传输数据速率也快,但是前者使用maven能直接生成代码,
后者生成代码麻烦使用自己工具还需要手工挪动
2 apache avro学习地址:
http://avro.apache.org/docs/current/gettingstartedjava.html
apache avro是说在rpc通讯时,使用avro这种数据序列化系统方式来实现数据传输
3 apache avro specification:
a) avro的规范 ,用于定义好序列化的格式
b) 写法解释:
user.avsc: 定义avro记录 文件结尾后缀为 .avsc {"namespace": "example.avro", 定义包名 "type": "record", 定义类型 类比于Java的 interface class等形式 "name": "User", 定义类名 "fields": [ 定义属性 {"name": "name", "type": "string"}, 类比于 String name {"name": "favorite_number", "type": ["int", "null"]}, 类比于 数组名favorite_number,数组值["int", "null"] {"name": "favorite_color", "type": ["string", "null"]} 类比于 数组名favorite_color,数组值["string", "null"] ] }
c) 如果定义更复杂格式的,参看: http://avro.apache.org/docs/current/spec.html#schema_primitive
d) avro序列化数据和java.io.serilized的区别:
avro ---> 顺丰
java.io.serilized ---> 平邮
4) 使用MAVEN生成user.avsc文件对应的Java对象:
a) eclipse内创建maven工程
b) 在pom.xml内增加 avro依赖和avro build文件:
<dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>org.apache.avro</groupId> <artifactId>avro-ipc</artifactId> <version>1.7.7</version> </dependency> <build> <plugins> <plugin> <groupId>org.apache.avro</groupId> <artifactId>avro-maven-plugin</artifactId> <version>1.7.7</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>schema</goal> 指定generate-sources生成方式格式参看schema格式 </goals> <configuration> <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory> <outputDirectory>${project.basedir}/src/main/java/</outputDirectory> </configuration> </execution> </executions> </plugin> <!-- compiler插件, 设定JDK版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <encoding>UTF-8</encoding> <source>1.6</source> <target>1.6</target> <showWarnings>true</showWarnings> </configuration> </plugin> </plugins> </build>
c) 创建文件夹,注意是文件夹
src/main/avro/
将创建的user.avsc拷贝在里面去,保证文件夹内只有这一个文件,这样在生成代码时,
就会只将此文件生成JavaBean
这块配置在如下文件中体现到:
<configuration> <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory> <outputDirectory>${project.basedir}/src/main/java/</outputDirectory> </configuration>
e) 工程右键/run as/8Maven generate-sources 生成代码;
此时在src/main/java/example.avro下生成Java类 User,打开如下:
/** * Autogenerated by Avro * * DO NOT EDIT DIRECTLY */ package example.avro; @SuppressWarnings("all") ........
f) 测试如下:
public static void main(String[] args) { User user = new User("zm",30,"red"); System.out.println(user); } {"name": "zm", "favorite_number": 30, "favorite_color": "red"}
上述案例和介绍参考官网链接: http://avro.apache.org/docs/current/gettingstartedjava.html
工程代码见附件: