Avro 特点:
1. 丰富的数据结构
2. 紧凑、快速、二进制数据格式
3. 容器文件,持久化数据
4. 支持RPC
5. 代码生成是可选的,便于和动态语言进行整合
Avro 与 Thrift、Protobuf 对比:
1. Dynamic typing: Avro does not require that code be generated. Data is always accompanied by a schema that permits full processing of that data without code generation, static datatypes, etc. This facilitates construction of generic data-processing systems and languages.
2. Untagged data: Since the schema is present when data is read, considerably less type information need be encoded with data, resulting in smaller serialization size.
3. No manually-assigned field IDs: When a schema changes, both the old and new schema are always present when processing data, so differences may be resolved symbolically, using field names.
以下是下载安装步骤:
1. 下载avro-tools-1.8.1.jar, 导入开发包
http://avro.apache.org/releases.html
https://mirrors.tuna.tsinghua.edu.cn/apache/avro/avro-1.8.1/java/
导入开发包:
<dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>1.8.1</version> </dependency>
2. 定义schema文件user.avsc
{"namespace": "example.avro", "type": "record", "name": "User", "fields": [ {"name": "name", "type": "string"}, {"name": "favorite_number", "type": ["int", "null"]}, {"name": "favorite_color", "type": ["string", "null"]} ] }
3. 生成java代码,静态实现
语法:java -jar /path/to/avro-tools-1.8.1.jar compile schema <schema file> <destination>
java -jar /path/to/avro-tools-1.8.1.jar compile schema user.avsc .
public class SerializationByAvroSchema { public static void main(String[] args) throws Exception{ readAvro() ; } static void writeAvro() throws Exception{ Schema schema = new Schema.Parser().parse(new File("D:/tmp/user.avsc")); GenericRecord user1 = new GenericData.Record(schema); user1.put("name", "Alyssa"); user1.put("favorite_number", 256); user1.put("favorite_color", "red"); GenericRecord user2 = new GenericData.Record(schema); user2.put("name", "Alyssa2"); user2.put("favorite_number", 258); user2.put("favorite_color", "green"); DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema); DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter); dataFileWriter.create(schema, new File("D:/tmp/users.avro")); dataFileWriter.append(user1); dataFileWriter.append(user2); dataFileWriter.close(); } static void readAvro() throws Exception{ Schema schema = new Schema.Parser().parse(new File("D:/tmp/user.avsc")); File file = new File("D:/tmp/users.avro"); DatumReader<GenericRecord> userDatumReader = new GenericDatumReader<GenericRecord>(schema); DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(file, userDatumReader); GenericRecord user = null; while (dataFileReader.hasNext()) { user = dataFileReader.next(user); System.out.println(user); } dataFileReader.close(); } }
4. 不生成java代码 动态实现
public class SerializationByAvroClass { public static void main(String[] args) throws Exception{ //readAvro(); //writeJavaObject(); } static void writeAvro() throws Exception{ User user1 = new User(); user1.setName("Alyssa"); user1.setFavoriteNumber(256); User user2 = new User("Ben", 7, "red"); User user3 = User.newBuilder() .setName("Charlie") .setFavoriteColor("blue") .setFavoriteNumber(null) .build(); DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class); DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter); dataFileWriter.create(user1.getSchema(), new File("D:/tmp/users.avro")); dataFileWriter.append(user1); dataFileWriter.append(user2); dataFileWriter.append(user3); dataFileWriter.close(); } static void readAvro() throws Exception{ File file = new File("D:/tmp/users.avro"); DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class); DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader); User user = null; while (dataFileReader.hasNext()) { user = dataFileReader.next(user); System.out.println(user); } dataFileReader.close(); } }
相关推荐
描述中提到"avro序列化数据C++代码",这意味着这个压缩包包含的是用C++实现的Avro数据序列化代码。使用Visual Studio 2017可以直接打开项目,意味着这些代码是为Windows平台编写的,并且已经过测试,确认可以正常...
Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在...为了提高效率和安全性,有时可以考虑使用自定义的序列化方法或者其他的序列化库,如Google的Protocol Buffers或Apache Avro等。
AVRO提供了丰富的数据结构类型、快速序列化以及支持动态类型语言和静态类型语言。 数据定义语言avdl是AVRO用于定义数据结构和远程过程调用协议的一种声明性语言。它是AVRO框架中定义数据模型和RPC接口的工具。通过...
IDL文件编译后,会在各个目标语言中生成相应的库,如Stub和Skeleton库,这两部分分别负责客户端和服务端的序列化和反序列化工作。 在实际应用中,有多种序列化方法可供选择: 1. XML(eXtensible Markup Language...
【标题】"commons-avro_2.10-0.0.3.zip" 提供的是Apache Commons Avro的相关版本,这是一个与Apache Hadoop相关的项目,主要处理Avro数据序列化和反序列化的库。Apache Avro是一个数据序列化系统,它设计用于高效地...
Avro是Apache Hadoop项目的一部分,它是一种数据序列化系统,用于高效地处理和存储数据。在Java中,Avro提供了两种主要的数据访问接口:GenericData和SpecificData。本项目"avro-specificdata-thread-safety-demo...
Apache Avro 是一种数据序列化系统,支持丰富的数据结构。 - **Thrift**: 工具。Apache Thrift 是一套跨语言的服务开发框架。 - **Protobuf**: 工具。Protocol Buffers (简称 Protobuf) 是Google的一种灵活高效的...
如果" gfc-avro-master "实际上是一个包含的子项目,那么它可能是关于如何在Scala中使用Avro进行数据序列化和反序列化的示例。Scala是一种多范式编程语言,结合了函数式和面向对象编程的特点,常用于大数据处理和...
8. **Avro**:Avro是Hadoop生态中的数据序列化系统,提供了一种紧凑、高效的二进制数据格式,支持动态语言和静态语言的互操作。 【Avro和JSON】 Avro是基于JSON模式的数据序列化系统,但比JSON更加优化,用于存储...
Avro的设计目标是为Hadoop提供更快、更紧凑的数据序列化方法,特别是在RPC场景中。由于其高性能和灵活性,Avro已经成为Hadoop生态系统中广泛使用的组件之一。 #### Hadoop Common:核心组件 **Hadoop Common** ...
如HBase(分布式NoSQL数据库)、Hive(基于Hadoop的数据仓库工具,支持SQL查询)、Pig(用于大数据分析的高级语言)、Sqoop(用于数据导入导出的工具)、Avro(数据序列化系统)和ZooKeeper(分布式协调服务)等。...