Hadoop之YARN的Avro框架實操

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("======反序列結束======");
    }
}
  • 運行,控制檯顯示反序列化結果
    在這裏插入圖片描述
  • 序列化文件生成
    在這裏插入圖片描述
  • 序列化結果
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章