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