2014年6月18日星期三

[翻译]Hadoop中的SequenceFile

【原文】http://blog.cloudera.com/blog/2011/01/hadoop-io-sequence-map-set-array-bloommap-files/ hadoop中的SequenceFile提供了一种持久存储二进制k-v键值对的数据结构。和B-tree不同,SequenceFile不能支持对指定key的修改,增加或删除。整个文件只能以追加的方式写入数据。 SequenceFile有三种存储格式:非压缩格式,记录压缩格式和分块压缩格式; 每种格式都包含一个Header,这个Header可以帮助读取方识别存储格式; 1. 包括key值和value的Class信息,读取方可以通过反射机制实例化这些类。 2. 版本 version number 3. 存储数据的格式,如果是压缩的格式,则还会提供压缩编码的class name信息; SequenceFile还可以包含一个二级k-v结构的列表,作为整个SequenceFile的metadata; SequenceFile的元数据信息中只能存储text-text类型的数据,元数据是在SequenceFile的Writer初始化的时候被写入的,因此元数据是不能被更改的。 元数据(摘自维基百科):其它文件保存信息常常伴随着文件自身保存在文件系统中。文件长度可能是分配给这个文件的区块数,也可能是这个文件实际的字节数。文件最后修改时间也许记录在文件的时间戳中。有的文件系统还保存文件的创建时间,最后访问时间及属性修改时间。(不过大多数早期的文件系统不记录文件的时间信息)其它信息还包括文件设备类型(如:区块数,字符集,套接口,子目录等等),文件所有者的ID,组ID,还有访问权限(如:只读,可执行等等)。 SequenceFile的文件存储有三种格式,其中非压缩和记录压缩两个格式非常类似;调用append方法来添加记录时,会append一个记录(record)到SequenceFile,Record包括: 整体record的长度(key长度+value长度);key长度;key;value;(key,value都是raw格式数据) 记录压缩和非压缩的区别仅在于,value是否是被压缩的,并且压缩时会提供一个压缩编码类; Block压缩格式相对比较复杂;数据在达到一个阈值前不会被写入,当达到阈值之后,所有的key和value都会被集中压缩,并生成keys的长度的list以及values的长度;两个块记录中间存在一个同步标记(sync marker) 如上图,每个块记录会记录buffer的记录数,还包含key长度的列表,keys列表,value长度列表,value列表; Hadoop的SequenceFile是其他文件的基础,例如:MapFile, SetFile, ArrayFile and BloomMapFile. 关于Sync标记: a sync point is a point in the stream which can used by to resynchronize with a record boundary if the reader is "lost" - for example after seeking to an arbitrary position on the stream. 其他: MapFile:实际上是一个有序的sequenceFile。它是一个包含两个sequenceFile的目录,data文件(/data)和index文件(/index); data包含所有的k-v记录,但是key(n+1)必须大于等于key(n), 当进行append()操作时会检查,如果检查失败,会返回一个IOException “Key out of order”.
index记录了所有key值和记录的偏移位置;index的数据会被加载到内存中,通过存储的映射关系快速定位到文件中的记录; 需要注意的是,index不会将所有的key都加载到内存中,默认情况,没个128条记录会有一条index的映射值存储到内存中,可以通过setIndexInterval来改变这个数值; SetFile和ArrayFile都是基于MapFile的,通过增加很少的几行代码实现的。 setFile只会append(key), value是一个NullWritable 的实例; ArrayFile只会append(value), key是一个LongWritable实例的记录编号,内容是count+1; BloomFile实现了MapFile,并且增加了另外一个bloom file(/bloom), 这个文件中存储的是序列化的DynamicBloomFilter变量,存储了新增加的key值;

没有评论:

发表评论