PHP程序员小白到大牛集训(12期免息)
作者信息

青灯夜游

今天学习一小步,明天提升一大步

最近文章
mysql中sum()函数怎么用880
linux中目录和文件的区别是什么236
linux ext3是什么968
视频教程分类
推荐视频教程
  • php程序员小白到大牛三个月集训php程序员小白到大牛三个月集训
  • Laravel 9 学习正当时—保姆级教程,想学不会都难!Laravel 9 学习正当时—保姆级教程,想学不会都难!
  • 千万级数据并发解决方案(理论+实战)千万级数据并发解决方案(理论+实战)
  • Laravel基础与实战(模块化)Laravel基础与实战(模块化)
  • UNI-APP开发(仿饿了么)UNI-APP开发(仿饿了么)
  • 首页 >运维 >Apache > 正文

    聊聊怎么解析Apache Avro数据(示例讲解)

    转载2022-02-22 10:47:161158 关注公众号:每天精选资源文章推送
    怎么解析Apache Avro数据?本篇文章给大家介绍一下序列化生成Avro数据、反序列化解析Avro数据、使用FlinkSQL解析Avro数据的方法,希望对大家有所帮助!

    随着互联网高速的发展,云计算、大数据、人工智能AI、物联网等前沿技术已然成为当今时代主流的高新技术,诸如电商网站、人脸识别、无人驾驶、智能家居、智慧城市等等,不仅方面方便了人们的衣食住行,背后更是时时刻刻有大量的数据在经过各种各样的系统平台的采集、清晰、分析,而保证数据的低时延、高吞吐、安全性就显得尤为重要,Apache Avro本身通过Schema的方式序列化后进行二进制传输,一方面保证了数据的高速传输,另一方面保证了数据安全性,avro当前在各个行业的应用越来越广泛,如何对avro数据进行处理解析应用就格外重要,本文将演示如果序列化生成avro数据,并使用FlinkSQL进行解析。

    本文是avro解析的demo,当前FlinkSQL仅适用于简单的avro数据解析,复杂嵌套avro数据暂时不支持。

    场景介绍

    本文主要介绍以下三个重点内容:

    • 如何序列化生成Avro数据

    • 如何反序列化解析Avro数据

    • 如何使用FlinkSQL解析Avro数据

    前提条件

    • 了解avro是什么,可参考apache avro官网快速入门指南

    • 了解avro应用场景

    操作步骤

    1、新建avro maven工程项目,配置pom依赖

    1.png

    pom文件内容如下:

    <?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.huawei.bigdata</groupId>
        <artifactId>avrodemo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <dependency>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro</artifactId>
                <version>1.8.1</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.avro</groupId>
                    <artifactId>avro-maven-plugin</artifactId>
                    <version>1.8.1</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.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>

    注意:以上pom文件配置了自动生成类的路径,即project.basedir/src/main/avro/{project.basedir}/src/main/avro/和{project.basedir}/src/main/java/,这样配置之后,在执行mvn命令的时候,这个插件就会自动将此目录下的avsc schema生成类文件,并放到后者这个目录下。如果没有生成avro目录,手动创建一下即可。

    2、定义schema

    使用JSON为Avro定义schema。schema由基本类型(null,boolean, int, long, float, double, bytes 和string)和复杂类型(record, enum, array, map, union, 和fixed)组成。例如,以下定义一个user的schema,在main目录下创建一个avro目录,然后在avro目录下新建文件 user.avsc :

    {"namespace": "lancoo.ecbdc.pre",
     "type": "record",
     "name": "User",
     "fields": [
         {"name": "name", "type": "string"},
         {"name": "favorite_number",  "type": ["int", "null"]},
         {"name": "favorite_color", "type": ["string", "null"]}
     ]
    }

    2.png

    3、编译schema

    点击maven projects项目的compile进行编译,会自动在创建namespace路径和User类代码

    3.png

    4、序列化

    创建TestUser类,用于序列化生成数据

    User user1 = new User();
    user1.setName("Alyssa");
    user1.setFavoriteNumber(256);
    // Leave favorite col or null
    
    // Alternate constructor
    User user2 = new User("Ben", 7, "red");
    
    // Construct via builder
    User user3 = User.newBuilder()
            .setName("Charlie")
            .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);
    dataFileWriter.create(user1.getSchema(), new File("user_generic.avro"));
    dataFileWriter.append(user1);
    dataFileWriter.append(user2);
    dataFileWriter.append(user3);
    dataFileWriter.close();

    执行序列化程序后,会在项目的同级目录下生成avro数据

    4.png

    user_generic.avro内容如下:

    Objavro.schema�{"type":"record","name":"User","namespace":"lancoo.ecbdc.pre","fields":[{"name":"name","type":"string"},{"name":"favorite_number","type":["int","null"]},{"name":"favorite_color","type":["string","null"]}]}

    至此avro数据已经生成。

    5、反序列化

    通过反序列化代码解析avro数据

    // Deserialize Users from disk
    DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
    DataFileReader<User> dataFileReader = new DataFileReader<User>(new File("user_generic.avro"), userDatumReader);
    User user = null;
    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);
    }

    执行反序列化代码解析user_generic.avro

    5.png

    avro数据解析成功。

    6、将user_generic.avro上传至hdfs路径

    hdfs dfs -mkdir -p /tmp/lztest/
    
    hdfs dfs -put user_generic.avro /tmp/lztest/

    6.png

    7、配置flinkserver

    • 准备avro jar包

    将flink-sql-avro-*.jar、flink-sql-avro-confluent-registry-*.jar放入flinkserver lib,将下面的命令在所有flinkserver节点执行

    cp /opt/huawei/Bigdata/FusionInsight_Flink_8.1.2/install/FusionInsight-Flink-1.12.2/flink/opt/flink-sql-avro*.jar /opt/huawei/Bigdata/FusionInsight_Flink_8.1.3/install/FusionInsight-Flink-1.12.2/flink/lib
    
    chmod 500 flink-sql-avro*.jar
    
    chown omm:wheel flink-sql-avro*.jar

    7.png

    • 同时重启FlinkServer实例,重启完成后查看avro包是否被上传

      hdfs dfs -ls /FusionInsight_FlinkServer/8.1.2-312005/lib

    8.png

    8、编写FlinkSQL

    CREATE TABLE testHdfs(
      name String,
      favorite_number int,
      favorite_color String
    ) WITH(
      'connector' = 'filesystem',
      'path' = 'hdfs:///tmp/lztest/user_generic.avro',
      'format' = 'avro'
    );CREATE TABLE KafkaTable (
      name String,
      favorite_number int,
      favorite_color String
    ) WITH (
      'connector' = 'kafka',
      'topic' = 'testavro',
      'properties.bootstrap.servers' = '96.10.2.1:21005',
      'properties.group.id' = 'testGroup',
      'scan.startup.mode' = 'latest-offset',
      'format' = 'avro'
    );
    insert into
      KafkaTable
    select
      *
    from
      testHdfs;

    9.png

    保存提交任务

    9、查看对应topic中是否有数据

    10.png

    FlinkSQL解析avro数据成功。

    【推荐:Apache使用教程

    以上就是聊聊怎么解析Apache Avro数据(示例讲解)的详细内容,更多请关注php中文网其它相关文章!

    PHP小白到大牛线上直播班第二十期

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除

  • 相关标签:Apache Avro数据
  • 相关文章

    相关视频


    专题推荐