Hadoop Outline Part 4 (I/O- SequenceFile/MapFile)

File-based Data Structure

SequenceFile

为什么需要这种文件格式?

1.提供二进制key-value结构,来存储流数据,便于map-red操作 

2.可以把小文件压缩到SequenceFile,这样可以提高性能,减少存储空间。


SequenceFile的读写

SequenceFile.createWriter/createReader

writer.append(key,value),

reader.next(key,value)


SequenceFile.seek不一定落在记录边界上。

SequenceFile.sync(position),可以跳转到最接近于position的sync point (同步点),同步点都是划在record边界上。


显示sequenceFile命令

% hadoop fs -text numbers.seq


SequenceFile文件格式

头三个字节SEQ,作为魔法数,标示文件类型

紧跟一个字节,标示版本号

然后是metadata信息,包括Key和value的类名

压缩codec信息,

用户自定义的元数据信息

同步标志(sync marker)

记录格式

   Record Length,Key Length,Key,Value (compressed or not)

Key不会压缩,压缩信息在文件头


块压缩(block compression)

记录可以被成一个块,当然必须达到定的字节大小,目前默认值是1M-Mb,有sync marker写在块边界。

格式:

记录数,key length,compressed keys,value length,compressed values


MapFile

MapFile是一个排序的SequenceFile,使用一个额外的索引文件,支持查找key。

MapFile的读写类似于SequenceFile,不过Key必须继承与WriteComparable,以便sort。


numbers.map是一个目录,包含data和index两个文件。index记录了key和它们在data文件的offset。值得一说的是,这些key并不是所有的key,而是一种采样的key,默认值是128间隔取一个key。



如何转换一个SequenceFile到一个MapFile?

分析:MapFile就是多了一个索引,所以可以用MapFile.fix(....)来重建index数据。当然了,SequenceFile必须是一个排序的。

排序可以用hadoop示例的map-reduce排序。

步骤:

1.Sort Sequence file to numbers.map/data

2.fix index.


你可能感兴趣的:(sequence,MapFile)