摘要:最近研究 Kafka
,其中数据对象的序列化和反序列化操作除了内置的序列化器外,还可以自定义对象序列化器,另外还有一中方法就是使用 Avro
,这种方法通过规范Schema
达到更通用的效果。本文单独抽离出如何使用 Avro
生成代码,该过程同样也可以在 Kafka
使用中利用。
概述
Avro
是 Hadoop 中的一个子项目,也是 Apache 中一个独立的项目,Avro
是一个基于二进制数据传输高性能的中间件。在 Hadoop
的其他项目中,例如 HBase
和 Hive
的 Client
端与服务端的数据传输也采用了这个工具。Avro
是一个数据序列化的系统,它可以提供:
1、丰富的数据结构类型
2、快速可压缩的二进制数据形式
3、存储持久数据的文件容器
4、远程过程调用 RPC
5、简单的动态语言结合功能,Avro
和动态语言结合后,读写数据文件和使用 RPC
协议都不需要生成代码,而代码生成作为一种可选的优化只值得在静态类型语言中实现。
Avro
支持跨编程语言实现(C, C++, C#,Java, Python, Ruby, PHP),Avro
提供着与诸如 Thrift 和 Protocol Buffers 等系统相似的功能,但是在一些基础方面还是有区别的,主要是:
1、动态类型:Avro
并不需要生成代码,模式和数据存放在一起,而模式使得整个数据的处理过程并不生成代码、静态数据类型等等。这方便了数据处理系统和语言的构造。
2、未标记的数据:由于读取数据的时候模式是已知的,那么需要和数据一起编码的类型信息就很少了,这样序列化的规模也就小了。
3、不需要用户指定字段号:即使模式改变,处理数据时新旧模式都是已知的,所以通过使用字段名称可以解决差异问题。
Avro
和动态语言结合后,读/写数据文件和使用 RPC
协议都不需要生成代码,而代码生成作为一种可选的优化只需要在静态类型语言中实现。
当在 RPC
中使用 Avro
时,服务器和客户端可以在握手连接时交换模式。服务器和客户端有着彼此全部的模式,因此相同命名字段、缺失字段和多余字段等信息之间通信中需要解决的一致性问题就可以容易解决。
还有,Avro
模式是用 JSON
(一种轻量级的数据交换模式)定义的,这样对于已经拥有 JSON
库的语言可以容易实现
本文主要介绍如何使用 Avro
的 Schema
文件生成代码,不会详细介绍 Schema
的语法等内容,可参考官方文档,以及如下博文。Avro介绍
使用Avro
生成代码
目标
在开发中,如果我们要使用 Avro
往往需要生成类文件,虽然这些文件不需要被管理,每次编译都可以自动生成,但是如果开发中能有一个生成好的类文件,对于测试和开发都有好处。本文介绍使用 Maven
依赖来完成这个过程,好处是不需要自己下载 jar
,自己敲命令行来完成代码生成。
这里着重介绍以下问题:
Avro
的Maven
插件的配置- 如何执行代码生成命令
Avro
的 Maven
插件的配置
首先引入依赖 org.apache.avro
<dependencies>
<!-- avro Dependency-->
<dependency>