HDFS---Block

块大小是在配置时改变。参考http://serverfault.com/questions/300135/hadoop-hdfs-set-file-block-size-from-commandline

Block 的分析 http://blog.sina.com.cn/s/blog_698853500100rxwu.html

  • org.apache.hadoop.hdfs.protocol
    • Block.java 实现Block 类,Block 文件名为”blk_”+BlockId,
    • BlockListAsLongs.java 提供了一个long[] 类型的接口用于访问list of blocks,在进行块报告的时候有用,返回的是long[] 型,而不是Block[] 型。里面就讲到了Block 有三个longs:block_id,block length 和 genration stamp(http://hi.baidu.com/jay23jack/blog/item /388d770bb4db20b72fddd40f.html 谈到了stamp 和BlockId 的作用和区别)。
    • BlockLocalPathInfo.java 本地文件系统数据块和它在本地元数据的路径。
    • LocateBlock.java/LocateBlocks.java 非常重要的基础类,LocatedBlock 的内容有如下:

LocatedBlock

数据块(Block 类型,offset of the first byte of the block in the file),

 数据块在文件的偏移(long),

 数据块指针(DatanodeInfo[]),

 是否损坏(boolean)。

LocatedBlocks

fileLength(文件长度,即块组长度)

 List<LocatedBlock> blocks (块组列表)

 underConstruction (是否在租约中)

  • org.apache.hadoop.hdfs.server.namenode
    • BlocksMap.java 块到块元数据(块属于哪个INode以及块存在哪些DataNodes上)的映射。BlockInfo 是BlocksMap 中的重要结构,保存了上面所说的映射关系, 继承了Block 类并包含了INodeFile 对象和Block[] 结构,该结构包含了(1)数据块所在DataNode 描述符,即triplets[3*i](2)triplets[3*i+1] 是前一个数据块(3)triplets[3*i+2]是后一个数据块。如下:

Block

blockId (long)

numBytes (long)

generationStamp(long)

BlockInfo

blockId (long)

numBytes (long)

generationStamp(long)

inode(INodeFile)

DN1|prev|next< >DN2|prev|next< >DN3|prev|next

  • org.apache.hadoop.hdfs.server.datanode
    • BlockAlreadyExistException.java 当块已经存在时不可写
    • BlockReceiver.java 接收一个块并写入到磁盘
    • BlockSender.java 从本地读取一个块发送给接收者
    • DataBlockScanner 扫描块,但不改变元数据。扫描速度限制在1MB 8MB,默认扫描时间为三周,块内包含了扫描类型时间和结果

参考:http://blog.csdn.net/AE86_FC/article/details/5842020 NameNode启动过程详细剖析