设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12133|回复: 0

一文解析Apache Avro数据

[复制链接]

63

主题

789

回帖

1382

积分

金牌会员

Rank: 6Rank: 6

积分
1382
发表于 2022-3-26 11:03:39 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
摘要:本文将演示如果序列化生成avro数据,并使用FlinkSQL进行解析。
Avro官方文档所写,http://avro.apache.org/docs/current/index.html.
Avro简介

avro是一个数据序列化系统
提供了:

  • 丰富的数据结构
  • 紧凑的,快速的,二进制的数据格式
  • 一种文件格式,用于存储持久化数据
  • 远程过程调用系统(RPC)
  • 和动态语言的简单交互。并不需要为数据文件读写产生代码,也不需要使用或实现RPC协议。代码生成是一种优化方式,但是只对于静态语言有意义。
技术背景

随着互联网高速的发展,云计算、大数据、人工智能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依赖

pom文件内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>

  6.     <groupId>com.huawei.bigdata</groupId>
  7.     <artifactId>avrodemo</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <dependencies>
  10.         <dependency>
  11.             <groupId>org.apache.avro</groupId>
  12.             <artifactId>avro</artifactId>
  13.             <version>1.8.1</version>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>junit</groupId>
  17.             <artifactId>junit</artifactId>
  18.             <version>4.12</version>
  19.         </dependency>
  20.     </dependencies>

  21.     <build>
  22.         <plugins>
  23.             <plugin>
  24.                 <groupId>org.apache.avro</groupId>
  25.                 <artifactId>avro-maven-plugin</artifactId>
  26.                 <version>1.8.1</version>
  27.                 <executions>
  28.                     <execution>
  29.                         <phase>generate-sources</phase>
  30.                         <goals>
  31.                             <goal>schema</goal>
  32.                         </goals>
  33.                         <configuration>
  34.                             <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
  35.                             <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
  36.                         </configuration>
  37.                     </execution>
  38.                 </executions>
  39.             </plugin>
  40.             <plugin>
  41.                 <groupId>org.apache.maven.plugins</groupId>
  42.                 <artifactId>maven-compiler-plugin</artifactId>
  43.                 <configuration>
  44.                     <source>1.6</source>
  45.                     <target>1.6</target>
  46.                 </configuration>
  47.             </plugin>
  48.         </plugins>
  49.     </build>

  50. </project>
复制代码
注意:以上pom文件配置了自动生成类的路径,即${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 :
  1. {"namespace": "lancoo.ecbdc.pre",
  2. "type": "record",
  3. "name": "User",
  4. "fields": [
  5.      {"name": "name", "type": "string"},
  6.      {"name": "favorite_number",  "type": ["int", "null"]},
  7.      {"name": "favorite_color", "type": ["string", "null"]}
  8. ]
  9. }
复制代码

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

4、序列化
创建TestUser类,用于序列化生成数据
  1. User user1 = new User();
  2. user1.setName("Alyssa");
  3. user1.setFavoriteNumber(256);
  4. // Leave favorite col or null

  5. // Alternate constructor
  6. User user2 = new User("Ben", 7, "red");

  7. // Construct via builder
  8. User user3 = User.newBuilder()
  9.         .setName("Charlie")
  10.         .setFavoriteColor("blue")
  11.         .setFavoriteNumber(null)
  12.         .build();

  13. // Serialize user1, user2 and user3 to disk
  14. DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
  15. DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
  16. dataFileWriter.create(user1.getSchema(), new File("user_generic.avro"));
  17. dataFileWriter.append(user1);
  18. dataFileWriter.append(user2);
  19. dataFileWriter.append(user3);
  20. dataFileWriter.close();
复制代码
执行序列化程序后,会在项目的同级目录下生成avro数据

user_generic.avro内容如下:
  1. 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"]}]}
复制代码
5、反序列化
通过反序列化代码解析avro数据
  1. // Deserialize Users from disk
  2. DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
  3. DataFileReader<User> dataFileReader = new DataFileReader<User>(new File("user_generic.avro"), userDatumReader);
  4. User user = null;
  5. while (dataFileReader.hasNext()) {
  6.     // Reuse user object by passing it to next(). This saves us from
  7.     // allocating and garbage collecting many objects for files with
  8.     // many items.
  9.     user = dataFileReader.next(user);
  10.     System.out.println(user);
  11. }
复制代码
执行反序列化代码解析user_generic.avro

avro数据解析成功。
6、将user_generic.avro上传至hdfs路径
  1. hdfs dfs -mkdir -p /tmp/lztest/
  2. hdfs dfs -put user_generic.avro /tmp/lztest/
复制代码

7、配置flinkserver
准备avro jar包
将flink-sql-avro-*.jar、flink-sql-avro-confluent-registry-*.jar放入flinkserver lib,将下面的命令在所有flinkserver节点执行
  1. 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
  2. chmod 500 flink-sql-avro*.jar
  3. chown omm:wheel flink-sql-avro*.jar
复制代码

同时重启FlinkServer实例,重启完成后查看avro包是否被上传
  1. hdfs dfs -ls /FusionInsight_FlinkServer/8.1.2-312005/lib
复制代码

8、编写FlinkSQL
  1. CREATE TABLE testHdfs(
  2.   name String,
  3.   favorite_number int,
  4.   favorite_color String
  5. ) WITH(
  6.   'connector' = 'filesystem',
  7.   'path' = 'hdfs:///tmp/lztest/user_generic.avro',
  8.   'format' = 'avro'
  9. );CREATE TABLE KafkaTable (
  10.   name String,
  11.   favorite_number int,
  12.   favorite_color String
  13. ) WITH (
  14.   'connector' = 'kafka',
  15.   'topic' = 'testavro',
  16.   'properties.bootstrap.servers' = '96.10.2.1:21005',
  17.   'properties.group.id' = 'testGroup',
  18.   'scan.startup.mode' = 'latest-offset',
  19.   'format' = 'avro'
  20. );
  21. insert into
  22.   KafkaTable
  23. select
  24.   *
  25. from
  26.   testHdfs;
复制代码

保存提交任务
9、查看对应topic中是否有数据

FlinkSQL解析avro数据成功。
到此这篇关于一文解析Apache Avro数据的文章就介绍到这了,更多相关Apache Avro数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表