Apache Avero是一个独立于编程语言的数据序列化系统,有一个被多种语言处理的数据格式。Avro的特点是,代码生成可选,意味着可以对遵循制定模式的数据进行读写操作。Avro通常采用JSON编写,数据通常用二进制格式编码。
Avro规范精确定义所有实现必须支持二进制格式。它有丰富的数据模式解析能力。在约束条件下,读数据模式不必与写数据模式相同。除此之外,其为一系列对象制定一个对象容器格式——类似与hadoop的顺序文件,还可以用于RPC,支持滚动升级,对多语言客户端进行支持。
Avro数据类型和格式:(补图)
1.所有的语言转到Avro语言API都可以使用动态映射,JAVA成为“通用”映射;
2.java和C艹可以自动生成代码来表示符合某一Avro模式的数据,java中成为“特殊”映射;
3.java拥有第三类“自反映射”,能够将Avro类型映射称实现已有的java类型,但是速度较前两种都慢
Avro数据文件
Avro的对象容器文件格式主要用于存储Avro对象序列
数据文件的头部分包含元数据,包括一个Avro模式和一个sync marker,紧接着是一系列包含序列化Avro对象的数据块。Avro数据文件是可切分的,适合MapReduce的快速处理。
可以使用不同的语言写入和读取Avro数据,可以选择与写入数据模式不同的模式来都会数据模式。
基于文件的数据结构
SequenceFile
考虑日志文件,其中每一条日志记录是一行文本。它同样可以座位小文件的容器。
SequenceFile的写操作
通过createWriter()静态方法可以创建SequenceFile对象,并返回SequenceFile.Writer实例。拥有SequenceFile.Writer实例之后就可以使用append()方法在文件末尾附加键/值对。写完之后可以调用close()方法结束。
写入SequenceFile对象示例代码:
public class SequenceFileWriteDemo{
private static final String[] DATA={
"One, two,buckle my shoe",
"Three, four shu the door"};
public static void main(String[] args){
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path path = new Path(uri);
IntWritable key = new IntWritable();
Text value = new Text();
SequenceFile.Writer writer = null;
try{
writer = SequenceFile.createWriter(fs, conf, path, key.getClass(), value.getClass());
for(int i = 0; i<100; i++){
key.set(100 - i);
value.set(DATA[i % DATA.length]);
System.out.println("[%s]\t%s\t%s\n", writer.getLength(), key, value);
writer.append(key, value);
}
}finally{
IOUtils.closeStream(writer);
}
}
}
其中,key的类型为IntWritable,value的类型为Text。