AVRO是Apache提供的一套序列化和RPC的机制
AVRO早期是为Hadoop设计的一套序列化系统,后来将AVRO独立出来。
序列化
1.序列化的目的:数据的存储和传输。
2.序列化的衡量标准:
a.序列化的时间及占用的CPU。
b.序列化之后产生的数据量。
c.序列化机制能否跨平台跨语言。
AVIO考虑到了跨语言传输的问题,采用了json格式。
maven工程依赖如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yasuofenglei</groupId>
<artifactId>avro</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<compiler-plugin.version>2.3.2</compiler-plugin.version>
<avro.version>1.7.5</avro.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-ipc</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
</plugin>
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.7.5</version>
<executions>
<execution>
<id>schemas</id>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
<goal>protocol</goal>
<goal>idl-protocol</goal>
</goals>
<configuration>
<!-- 存放asdv文件的目录 -->
<sourceDirectory>${project.basedir}/src/main/resources/avro</sourceDirectory>
<!-- 产生的java文件的存放目录 -->
<outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
resources下新建avro目录,并新建User.avsc
{
"namespace":"avro.pojo",//指定了一个包名avro.pojo
"type":"record",//表示定义的是一个类
"name":"User",//类名为User
"fields":[
{"name":"username","type":"string"},//String username
{"name":"age","type":"int"}//int age
]
}
点击maven->gemerate sources生成实体类
编写序列化代码
package avro;
import avro.pojo.User;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumWriter;
import java.io.File;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
User u=new User();
u.setAge(18);
u.setUsername("tom");
//创建序列化流
DatumWriter<User> dw=new SpecificDatumWriter<User>();
//需要将数据序列化到文件中
DataFileWriter<User> dfw=new DataFileWriter<User>(dw);
//指定写到哪个文件中
dfw.create(User.SCHEMA$,new File("1.txt"));
//序列化
dfw.append(u);
dfw.close();
}
}
RPC
1.全称是远程过程调用,允许一个节点远程调用另一个节点上的方法而不用做实现。
2.存根的作用是限制两个节点上能调用的方法是一样的。