原文: http://www.cloudera.com/blog/2011/01/hadoop-io-sequence-map-set-array-bloommap-files/
hadoop 的 sequenceFile 文件为二进制的 K-V 对提供了可持久的数据结构。与其他的数据结构,像 B 树索引是有区别的, sequenceFile 不支持对特定的 key 进行修改,插入,删除操作,仅仅支持 append 操作。
SequenceFile 有三种格式:非压缩,行压缩,块压缩。他们都会共用一个文件头信息。这个文件头信息包括: k,v 类名字,版本号,格式化信息(是否压缩,是否是块压缩,如果是压缩格式,还包括压缩算法名字)。
非压缩与记录压缩比较相似,每次调用 append 方法就会将记录增加到 sequence 文件中,内容有整个记录的大小 (key 的长度 +value 的长度 ) , key 的长度, key,value 的原始数据。二者的不同点就是 value 的原始数据,一个是压缩的,一个是非压缩。
而对于块压缩格式,当数据的大小达到某个阀值,比如数据块大小 64M ,这些才会将数据写入文件,而且此时到目前为止的所有 key 放在一起进行,所有 value 放在一起,然后再加上每个 k,v 所占的长度列表。
块记录 : 记录长度 + 所有 key 数据,所有 value 的数据,所有 key 的长度列表,所有 value 的长度列表,同时每个块之间会有写下 sync 标记。
基于 sequencefile 之上,还有一些其他文件格式,如 MapFile,SetFile,ArrayFile,BloomMapFile 。
MapFile 是由二个 sequenceFile 组成的 : 数据文件和索引文件。数据文件是有按从小到大的顺序插入,如果再 append 时,违反了这种关系,将会抛出异常。索引文件包括 key, 以及该条记录在数据文件的起始位置,索引文件不会包括所有的 key ,只是一部分 key 值。一般索引会全部读入内存,如果索引很大,可以设置每次读入内存的索引条数。
SetFile 和 ArrayFile 是基于 MapFile 的, SetFile 用 append(key) 来替换 append(key,value) 的,因为 value 总是 null 。 ArrayFile 则是用 append(value) ,而 key 则是 long 类型,代表是每几条记录,一直递增的。
BloomMapFile 是在 MapFile 之上增加了一个文件,名叫 /bloom ,该文件将记录着新增记录后的布隆值,当 close() 操作时,就将布隆值写入到这个 bloom 文件中。
在 hadoop 之上,也还有其他的一些文件格式,如 tfile,hbase 的 hfile 等,具体的实现见 :org.apache.hadoop.io 包中的相关类。
另外,记录由于 maven 库无法访问而使得无法 build 的解决方法:
在编译 hadoop 时由于 maven 需要访问国外 maven 库网站,但由于该网站被墙,会抛出 socket.net 的异常错误,遇到此类问题,方法有二个:一是找一个能访问的 maven 库网站,如 : http://mirrors.ibiblio.org/pub/mirrors/maven2 。将 mavens 用到的 build.xml , ivysetting.xml 二个文件中的 http://repo2.maven.org/maven2 都用上面的网站替换,另外一种方法是,对 ant 设置代理访问,在 ivy-download 任务前加上的一个 proxy 任务,然后先打开代理,如自由门,然后进行 build 工作。
<target name= "proxy" > <property name= "proxy.host" value= "127.0.0.1" /> <property name= "proxy.port" value= "8580" /> <input message= "Please enter proxy username" addproperty= "proxy.user" /> <input message= "Please enter proxy password - NOTE: CLEAR TEXT" addproperty= "proxy.pass" /> <setproxy proxyhost= "${proxy.host}" proxyport= "${proxy.port}" proxyuser= "${proxy.user}" proxypassword= "${proxy.pass}" /> </target> <target name= "ivy-download" depends= "proxy" description= "To download ivy" unless= "offline" > <get src= "${ivy_repo_url}" dest= "${ivy.jar}" usetimestamp= "true" /> |