triplets@BlockInfo

来源:百度文库 编辑:神马文学网 时间:2024/04/27 13:58:22
http://blog.csdn.net/sxf_824/archive/2009/11/20/4842196.aspx

/**

     * This array contains triplets of references.

     * For each i-th data-node the block belongs to

     * triplets[3*i] is the reference to the DatanodeDescriptor

     * and triplets[3*i+1] and triplets[3*i+2] are references 

     * to the previous and the next blocks, respectively, in the 

     * list of blocks belonging to this data-node.

     */

 private Object[] triplets首先明确:下面的i是什么东西?   0<= i < replication也就是说:HDFS中的一个块通过一个BloclInfo对象来维护它自身的备份!如果备份数为3(分布在三台DN上),则这个数组大小为3X3=9,每个DN有3个单元对应它。这些DN的编号从 0 -->(replication-1)triplets是一个关键字段。通过triplets[3*i+1] 和 triplets[3*i+2]可以得到某台(即第i台)datanode机器上所有的block列表,triplets[3*i+1] 和triplets[3*i+2]为BlockInfo类型对象。

该项功能主要应用在DatanodeDescriptor实例的

private volatile BlockInfo blockList = null 这个字段中。

通过triplets[3*i]可以得到第i个Block副本的所属datanode的位置====>triplets[3*i]为DatanodeDescriptor类型对象。

抓住BlockInfo就抓住了整个HDFS按Block进行文件分布式存储的关键。

BlockInfo信息中不仅包括了一个Block都存储在哪些DataNode上,还包含了某个具体datanode上存储的所有Block信息,以及该block属于哪一个INodeFile。
用户需要读取文件时首先通过INodeFile得到这个文件所有的Block---INodeFile中的 BlockInfo[] getBlocks() 方法。通过BlockInfo又可以得到Block存储的DataNodeInfo列表。 用户就可以向得到的DataNode列表的机器发送读取Block具体数据的请求(这部分具体实现后面再讲)。

在系统运行过程中,上述关键对象主要存储在内存中,也就是说HDFS的Namenode有一个内存镜像,其中的内容就是以上对象组成的树形结构,也许有人会问,如果Namenode当机会出现什么问题呢?这个问题问得好:)(具体的解决办法后续会详细讲解,目前先提一下)

HDFS为了能够保证数据安全性,完整性,采用和数据库一样的容灾机制,记录数据操作行为日志:对应的功能对象为FSEditLog 。 

系统定时将内存中的文件系统结构镜像序列化到磁盘(FsImage),并删除当前的EditLog 。 如果系统机器重启,Namenode会从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。