SequenceFile & MapFile

来源:互联网 发布:淘客群管软件 编辑:程序博客网 时间:2024/05/15 05:36


SequenceFile

Hadoop的SequenceFile适合记录二进制类型的数据,为二进制key - Value对提供了一个持久数据结构 
SequenceFile作为日志文件的存储格式时,使用者可以直接选择Key和Value 
SequecneFile也可以作为小文件的容器,将小文件进行包装,从而获得更高效率的存储和处理

SequenceFile的写操作

这里写图片描述
命令行查看内容:

$>hdfs dfs -cat /user/mysequenceFile.seq查看到的文件内容为二进制格式的文件
  • 1
  • 2
使用-text命令可以查看到正确格式的文件内容:$>hdfs dfs -text /user/mysequenceFile.seq
  • 1
  • 2

SequenceFile的读操作

这里写图片描述

SequenceFile的格式

SequenceFile是一种顺序文件的格式,可以进行切割操作(根据同步点进行切割) 
每一行是k-v对 
格式:head + record 
record格式:SEQ + version + key class + value class

SequenceFile 有三种压缩态: 
Uncompressed:未进行压缩的状 
record compressed:对每一条记录的value值进行了压缩(文件头中包含上使用哪种压缩算法的信息) key没有被压缩 
block compressed:指一次性压缩多条记录,当数据量达到一定大小后,将停止写入进行整体压缩,整体压缩的方法是把所有的keylength,key,vlength,value 分别合在一起进行整体压缩,块的压缩效率要比记录的压缩效率高

指定同步点写入SequenceFile

这里写图片描述

不使用压缩算法写入SequenceFile

这里写图片描述

使用压缩算法写入SequenceFile

这里写图片描述

考察SequenceFile默认情况下使用的压缩态和压缩编解码器

这里写图片描述

SequenceFile的读取方式有两种,第一种是调用seek()方法进行读取该方法将指针指向文件中的指定位置;第二种是通过同步点查找记录边界,对文件进行读取。通过sync(long position)方法可以将读取位置定位到position之后的下一个同步点。顺序文件在读取失败之后,会有纠错机制,而这种机制就是根据同步点sync进行纠错的

使用seek()读取SequenceFile

这里写图片描述

使用sync(long position)读取SequenceFile

这里写图片描述

MapFile

MapFile是已经排过序的SequenceFile,它有索引,所以可以按键查找 
格式:index + data 
在写入过程中,必须要求Key按照大小顺序添加的。如果不按照大小顺序写入,会报错

index:索引和偏移量的映射 可以设置间隔值,默认128;index文件包含一部分键和data文件中键到其偏移量的映射;通过配置文件可以进行设置io.map.index.interval,可以进行折半查找(更快的搜索海量数据) 
data: key - value形式;可以寻找与指定key最近的key,可以设置是否向前寻找 
举例: 
index 每隔128个键做了一个偏移 1-128 129-257 257-385…. 

129 
257 
… 
index中可以设置键的大小: 
读取时可以进行折半查找,用这种方法进行按键查找效率高

[core-default.xml]<property>  <name>io.map.index.interval</name>  <value>128</value>  <description>    MapFile consist of two files - data file (tuples) and index file    (keys). For every io.map.index.interval records written in the    data file, an entry (record-key, data-file-position) is written    in the index file. This is to allow for doing binary search later    within the index file to look up records by their keys and get their    closest positions in the data file.  </description></property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

MapFile的两种写入方式

这里写图片描述

读取MapFile文件时可以采用seek()方法进行定位读取,seek()方法根据key值进行查找,查找方法使用了binarySearch,该方法存在于MapFile$Reader.class中,实现如下: 
这里写图片描述 
MapFile也可以使用getCloset()方法进行读取,返回的是与指定键匹配最接近的Key

MapFile的两种读取方式

这里写图片描述

MapFile的变形

Hdoop中实现了MapFile的几种变形: 
SetFile:用于存储Writable键的集合,键必须按照排好的顺序添加,无Value值 
ArrayFile:Key是一个整型,Value是一个Writable类型的值

SequenceFile向MapFile的转变

MapFile相当于加有索引并且进行过排序的SequenceFile,因此可以通过MapFile的fix()方法,对SequenceFile进行重建索引,从而完成转变 
这里写图片描述

原创粉丝点击