怎么解析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依赖
pom文件内容如下:
<?xml version="1.0" encoding="utf-8"?><project> <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/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"]} ] }
3、编译schema
点击maven projects项目的compile进行编译,会自动在创建namespace路径和user类代码
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();</user></user></user></user>
执行序列化程序后,会在项目的同级目录下生成avro数据
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></user></user></user>
执行反序列化代码解析user_generic.avro
avro数据解析成功。
6、将user_generic.avro上传至hdfs路径
hdfs dfs -mkdir -p /tmp/lztest/ 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节点执行
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
-
同时重启flinkserver实例,重启完成后查看avro包是否被上传
hdfs dfs -ls /fusioninsight_flinkserver/8.1.2-312005/lib
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、查看对应topic中是否有数据
flinksql解析avro数据成功。
【推荐:apache使用教程】
以上就是聊聊怎么解析apache avro数据(示例讲解)的详细内容,更多请关注代码网其它相关文章!
发表评论