Hadoop实战-初级部分 之 Hadoop IO(二)

2014-11-24 03:26:57 · 作者: · 浏览: 1
便网络传输,充分利用存储空间 2.快速(Fast)即序列化及反序列化性能要好 3.扩展性(Extensible)即协议有变化,可以支持新的需求 4.互操作性(Interoperable)即客户端及服务器端不依赖语言的实现 Hadoop使用Writables,满足紧凑、快速,不满足扩展能及互操作性 Hadoop的序列化不是java的序列化,Hadoop自己实现了自己的序列化机制。格式Writables。 Hadoop中定义了两个序列化相关的接口:Writable接口和Comparable接口,这两个接口可以合成一个接口WritableComparable. Writable 接口 Writable 接口定义了两个方法: (1)一个用于将其状态写入二进制格式的 DataOutput 流; (2)另一个用于从二进制格式的 DataInput 流读取其状态;
我们可以使用 set() 函数来创建和设置 Writable 的值: IntWritable wirtable = new IntWritable(); writable.set(163); 同样我们也可以使用构造函数: IntWritable writable = new IntWritable(163); package org.apache.hadoop.io; import java.io.DataOutput; import java.io.DataInput; import java.io.IOException; public interface Writable { void write(DataOutput out) throws IOException; void readFields(DataInput in) throws IOException;}
Writable 接口 Writable 接口定义了两个方法: (1)一个用于将其状态写入二进制格式的 DataOutput 流; (2)另一个用于从二进制格式的 DataInput 流读取其状态;
我们可以使用 set() 函数来创建和设置 Writable 的值: IntWritable wirtable = new IntWritable(); writable.set(163); 同样我们也可以使用构造函数: IntWritable writable = new IntWritable(163); IntWritable 实现了 WritableComparable 接口 ,后者是 Writable 与java.lang.Comprable 接口的子接口 package org.apache.hadoop.io; public interface WritableComparable extends Writable,Comparable {} Hadoop 优化比对,不需要反序列化即可比较。 package org.apache.hadoop.io; import java.util.Comparator; public interface RawComparator extends Comparator { public int compare( byte [] b1, int s1, int l1, byte [] b2, int s2, int l2); } WritableComparator 是一个 RawComparator 通用的实现 ,为WritableComparable classes. 它做了两件事 1.实现了 compare() 方法(返序列化) 2.它充当的是 RawComparator 的工厂类 Hadoop 自带的序列化接口 实现了 WritableComparable 接口的类: 基础: BooleanWritable | ByteWritable 数字: IntWritable | VIntWritable | FloatWritable | LongWritable |VLongWritable | DoubleWritable 高级: NullWritable | Text | BytesWritable | MDSHash | ObjectWritable |GenericWritable 仅实现了 Writable 接口的类: 数组: ArrayWritable | TwoDArrayWritable 映射: AbstractMapWritable | MapWritable | SortedMapWritable Text Text是UTF-8的Writable。可以将它理解为一种与java.lang.String 相类似的Writable。Text类代替了UTF-8类。 Text是可变的,其值可以通过调用set()方法来改变。最大存储是2GB。 NullWritable NullWritable是一种特殊的Writable类型,因为它的序列化的长度是零。可以做占位符。 BytesWritable
BytesWritable 是一个二进制的数据数组封装。它的序列化格式是一个int字段. BytesWritable是可变的,其值可以通过调用set()方法来改变。 ObjectWriable ObjectWriable 适用于字段可以使用多种类型时。 Writable集合 一共 四种: ArrayWritable和TwoDArrayWritable是针对数组与二维数组 MapWritable和SortededMapWritable 针对是Map与SortMap 实现WritableComparable 实现 /** * 将对象转换为字节流并写入到输出流out中 */ write() /** * 从输入流in 中读取字节流并反序列化为对象 */ readFields(), /** * 将this对像与对象O比较*/ compareTo()方法。 第四部分:基于文件的数据结构 SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将 对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中 Key是任意的Writable,Value是任意的Writable我们可以实现将许多小文件转化为SequenceFile,以方便Map/Reduce处理实际上,现在Hadoop处理时,都会将数据转为SequenceFile格式,无论是性能还是压缩上的考量。 这种文件格式 有以下好处: A.支持压缩,且可定制为基于Record或Block压缩(Block级压缩性能较优) B.本地化任务支持:因为文件可以被切分,因此MapReduce任务时数据的本地化情况应该是非常好的。 C.难度低:因为是Hadoop框架提供的API,业务逻辑侧的修改比较简单。 写 SequenceFile 步骤: 1. 设置 Configuration 2. 获取 File System 3. 设置文件输出路径 4. SequenceFile.createWriter 创建 SequenceFile.Writer 然后写入 5. 调用 SequenceFile.Writer .append 追加写入 6. 关闭流 读 SequenceFile 步骤: 1. 设置 Configuration 2. 获取 File System 3. 设置文件输出路径 4. SequenceFile.Reader 创建读取类 SequenceFile.Reader 5. 拿到 Key 与 Value 的 class 6. 读取 通过命令行读写 SequenceFile 步骤: 1. 设置 Con