MapReduce学习(四):Hadoop两种存储方式SequenceFile和MapFile
1. Hadoop的两种存储方式简介
(1)无Hadoop的两种数据存储方式:
SequenceFile方式: 无序存储
MapFile方式: 会对key建立索引文件,value按key顺序存储
(2)其中基于MapFile的结构具体包括:
•ArrayFile 像我们使用的数组一样,key值为序列化的数字
•SetFile 他只有key,value为不可变的数据
•BloomMapFile 在 MapFile 的基础上增加了一个 /bloom 文件,包含的是二进制的过滤表,在每一次写操作完成时,会更新这个过滤表。
2. SequenceFile存储方式
(1)SequeceFile存储格式简介:
SequenceFile的存储类似于Log文件,所不同的是Log File的每条记录的是纯文本数据,而SequenceFile的每条记录是可序列化的字符数组。
(2)SequeceFile完成新纪录的添加操作的API是:
fileWriter.append(key,value)
可以看到,每条记录以键值对的方式进行组织,但前提是Key和Value需具备序列化和反序列化的功能
补充:Hadoop预定义了一些Key Class和Value Class,他们直接或间接实现了Writable接口,满足了该功能,包括:
Text 等同于Java中的String
IntWritable 等同于Java中的Int
BooleanWritable 等同于Java中的Boolean
(3)SequeceFile的数据压缩方式:
SeqeunceFile支持两种格式的数据压缩,分别是:record compression和block compression。
record compression如上图所示,是对每条记录的value进行压缩
block compression是将一连串的record组织到一起,统一压缩成一个block
(4)SequeceFile核心API:
读/写操作。即:Reader 和 Writer
3. SequenceFile代码实例
4. MapFile简介
(1)MapFile简介:
MapFile是排序后的SequenceFile,通过观察其目录结构可以看到MapFile由两部分组成,分别是data和index。
其中,index作为文件的数据索引,主要记录了每个Record的key值,以及该Record在文件中的偏移位置。
(2)MapFile索引机制:
在MapFile被访问的时候,索引文件会被加载到内存,通过索引映射关系可迅速定位到指定Record所在文件位置,因此,相对SequenceFile而言,MapFile的检索效率是高效的,缺点是会消耗一部分内存来存储index数据。
(3)MapFile索引机制注意事项:
MapFile并不会把所有Record都记录到index中去,默认情况下每隔128条记录存储一个索引映射。当然,记录间隔可人为修改,通过MapFIle.Writer的setIndexInterval()方法,或修改io.map.index.interval属性;
(4)MapFile的核心API
读/写 Reader 和 Writer
补充:与SequenceFile不同的是,MapFile的KeyClass一定要实现WritableComparable接口,即Key值是可比较的
5. MapFile代码实例: