hadoop io Sequence, Map, Set, Array, BloomMap Files(译文)

原文: 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" />

 

 

 

你可能感兴趣的:(数据结构,maven,hadoop,IO,Build,download)