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

工程代码见附件:

相关推荐