201707041940复习-hadoop篇2:序列化和压缩和序列化框架
9一、序列化
1、序列化在分布式数据处理的两大领域经常出现:进程间的通信和永久存储
2、hadoop使用的是自己的序列化格式Writable,它紧凑,速度快,但不太容易被java意外的语言进行扩展和使用,
3、avro是一个序列化的框架,克服了writable的不足
4、writable定义了两个方法:将其状态写到DataOutput二进制流和另一个从DataInput二进制流读取数据
5、
6、上面的图片中是hadoop已经实现的一些类,例如IntWritable类,实现了Writable接口和WritableComparable接口,所以在类中必须实现3个方法:
Writable接口中的write(DataOutput out)方法和readFields(DataInput in)
WritableComparable接口中的compareTo(T o)方法
7、上面的比较都是需要先反序列化后,再用compareTo(Object o)进行比较
8、比较两个对象的方式还有另外一种comparator的compare(Object o1, Object o2) ,以前需要自己写一个实现类作为比较器,且自己的比较器中也必须反序列化对象,然后进行比较,现在hadoop为我们体统了一个通用的比较器:WritableComparator,这个类中的比较方法是直接对二进制流进行比较,而不进行反序列化,所以当比较两个对象是可以这样:
RawComparator<IntWritable> comparator = WritableComparator.get(InteWritable.class); // WritableComparator类是Raw的一个实现类
comparator.compare(new IntWritable(5), new IntWritable(6)); // 可以实现二进制字节流的比较
9、如果自己定义一个类,需要实现WritableComparable接口,就必须实现write()方法和readFields()方法和comparaTo(T o)方法。
10、序列化框架1:avro
avro:由doug cutting(hadoop之父)创建,目的在于解决hadoop中Writable的不足:缺乏语言的可移植性。
avro模式通常用json来写,数据通常采用二进制个事来编码。
avro用json来描述一个实体类,然后序列化时读取这个json文件,这个json文件统称为schema文件,然后进行序列化和反序列化,在工作中用到再次查看。
avro实现mr程序:
11、序列化框架2:protocol buffers 简称protobuf ,google的产品
也是使用一个文件来描述对象的序列化方式,然后用一定的解析代码来解析这个文件,对对象进行序列化和反序列化
12、序列化框架3:apache thrift : 略,当使用到时在学习
13、压缩:
13.1、6种压缩方式:
deflate 不可切割 org.apache.hadoop.io.compress.DefaultCodec
gzip 不可切割 org.apache.hadoop.io.compress.GzipCodec
bzip2 可切割 org.apache.hadoop.io.compress.BZip2Codec
lzo 不可切割 com.hadoop.compression.lzo.LzopCodec lzo和lzo4在linux系统上不支持,需要先下载安装才行。然后再使用maven导入相关的类库才能使用
lzo4 不可切割 org.apache.hadoop.io.compress.Lz4Codec
snappy 不可切割 org.apache.hadoop.io.compress.SnappyCodec snappy在linux上不支持,也需要先下载安装,但是类库hadoop已经提供了,不需要再次下载了。
13.2、对大文件来说,不要使用不支持切分整个文件的压缩格式,因为会失去数据的本地特性,进而造成mr应用效率低下。