YARN Avro框架
一.概念
1.概念
Apache Avro是Hadoop下的一個子項目。它本身既是一個序列化框架,同時也實現了RPC的功能。
2.特點
- 豐富的數據結構類型;
- 快速可壓縮的二進制數據形式;
- 存儲持久數據的文件容器;
- 提供遠程過程調用RPC;
- 簡單的動態語言結合功能。
3.相對於Protocol Buffers 具備如下特性:
- 支持動態模式。Avro不需要生成代碼,這有利於搭建通用的數據處理系統,同時避免了代碼入侵。
- 數據無須加標籤。讀取數據前,Avro能夠獲取模式定義,這使得Avro在數據編碼時只需要保留更少的類型信息,有利於減少序列化後的數據大小。
- 無須手工分配的域標識。Thrift和Protocol Buffers使用一個用戶添加的整型域唯一性定義一個字段,而Avro則直接使用域名,該方法更加直觀、更加易擴展。
二.項目實現
- 思路:
0、新建項目,添加maven依賴
1、下載Avro編譯器
2、定義消息格式
3、使用編譯器編譯信息文件成Java源碼文件(可選擇)
4、使用Avro API編寫代碼
1.新建項目,添加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>org.example</groupId>
<artifactId>avro</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-tools</artifactId>
<version>1.9.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.9.2</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.下載avro編譯器
1) https://mirror.bit.edu.cn/apache/avro/avro-1.9.2/java/
在上述網站中選擇如下圖所示的兩個jar包進行下載即可
2) 自設隨便放在電腦某個路徑下
3.定義消息格式
1) 建立一個文本文檔 命名爲user.avro,在裏面寫此代碼
{"namespace": "com.avro.withcode",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": ["int", "null"]},
{"name": "favorite_color", "type": ["string", "null"]}
]
}
2) 將此文本複製粘貼到項目中
4.使用編譯器編譯信息文件成Java源碼文件
1) 使用編譯文件進行編譯
- 代碼: java -jar D:\avro-1.9.2\avro-tools-1.9.2.jar compile schema user.avro ./src/main/java/
2) 編譯完畢,出現此路徑與User.Java源碼文件
5.調用API編寫測試類 SerializationDemo.java
package com.avro.withcode;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import java.io.File;
import java.io.IOException;
public class SerializationDemo {
public static void main(String[] args) throws IOException {
User user1 = new User();
user1.setName("agatha");
user1.setFavoriteNumber(727);
// Leave favorite color null
// Alternate constructor
User user2 = new User("fyx", 105, "black");
// Construct via builder
User user3 = User.newBuilder()
.setName("fang")
.setFavoriteColor("blue")
.setFavoriteNumber(null)
.build();
// Serialize user1, user2 and user3 to disk
DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
File file = new File("users.avro");
dataFileWriter.create(user1.getSchema(), file);
dataFileWriter.append(user1);
dataFileWriter.append(user2);
dataFileWriter.append(user3);
dataFileWriter.close();
System.out.println("序列化ok~");
// Deserialize Users from disk
DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);
User user = null;
System.out.println("======反序列開始======");
while (dataFileReader.hasNext()) {
// Reuse user object by passing it to next(). This saves us from
// allocating and garbage collecting many objects for files with
// many items.
user = dataFileReader.next(user);
System.out.println(user);
}
System.out.println("======反序列結束======");
}
}
- 運行,控制檯顯示反序列化結果
- 序列化文件生成
- 序列化結果