HDFS—Protocol

core 文件夹下有个versionProtocol 是所有使用Hadoop RPC 的父类。它只具有一个获取版本的方法。

ClientDatanodeProtocol、InterDatanodeProtocol、ClientProtocol、DatanodeProtocol 和 NamenodeProtocol 是他们的子类。关系如下:

他们在Client、Namenode 和 Datanode 三方的关系如下图:

在hdfs protocol 下是一些公用的Protocol,UML 如下(没有包括namenode 内的protocol):

NamenodeProtocol

InterDatanodeProtocol

DatanodeProtocol

ClientProtocol(最复杂重要,实现了客户端操作名字空间的接口)

ClientDatanodeProtocol

最后附上namenode 启动的流程

HDFS—protocol

org.apache.hadoop.hdfs.protocol 包内类:

  • AlreadyBeingCreatedException.java
  • The exception that happens when you ask to create a file that already is being created, but is not closed yet.
  • 当要求创建一个正在被创建且没有被关闭的文件会抛出这样的错误
  • Block.java
  • A Block is a Hadoop FS primitive, identified by a long.
  • Block 是Hadoop FS 的基元,由long 型定义

 

  • BlockListAsLongs.java
  • This class provides an interface for accessing list of blocks that has been implemented as long[]. This class is usefull for block report. Rather than send block reports as a Block[] we can send it as a long[].
  • 这个类提供了一个long[] 类型的借口用于访问一组数据块,这个类在DataNode 向NameNode 汇报块时有用。

 

  • BlockLocalPathInfo.java
  • A block and the full path information to the block data file and the metadata file stored on the local file system.
  • 本地数据块和它在本地元数据的全路径。(0.20.0 版本无,故删除)

 

  • ClientDatanodeProtocol.java
  • An client-datanode protocol for block recovery
  • 继承VersionedProtocol 的一个接口,用于块恢复。

 

  • ClientProtocol.java
  • ClientProtocol is used by user code via  {@link org.apache.hadoop.hdfs.DistributedFileSystem} class to communicate  with the NameNode.  User code can manipulate the directory namespace,  as well as open/close file streams, etc.
  • ClientProtocol 是Client 端通过org.apache.hadoop.hdfs.DistributedFileSystem 类打开、关闭文件流操作的目录名字空间的

 

  • DatanodeID.java
  • DatanodeID is composed of the data node name (hostname:portNumber) and the data storage ID, which it currently represents.
  • DatanodeID 由数据节点名称(主机名:端口号)和数据存储ID

 

  • DatanodeInfo.java
  • DatanodeInfo represents the status of a DataNode. This object is used for communication in the Datanode Protocol and the Client Protocol.
  • DatanodeInfo 代表DataNode 的状态。这个对象是用来在Datanode Protocol 和Client Protocol中进行通信的。

 

  • DataTransferProtocol
  • The Client transfers data to/from datanode using a streaming protocol.
  • 定义了一些public static final byte 变量,用于Client 流式数据传输协议。

 

  • FSConstants.java 接口
  • Some handy constants
  • 常用的变量。(每次最小写入5 个数据块,路径长度最多8k,深度最深1k)

 

  • LocatedBlock.java
  • A LocatedBlock is a pair of Block, DatanodeInfo[] objects. It tells where to find a Block.
  • LocatedBlock 是一组Block,DatanodeInfo[] 对象集合,通过它可以找到一个块(关于块,参考

 

  • LocatedBlocks.java
  • Collection of blocks with their locations and the file length.
  • 通过LocatedBlock.java 或者一组数据块的位置和文件长度。

 

  • QuotaExceededException 继承IOException
  • The message for the exception specifies the directory where the quota was violated and actual quotas.
  • 消息指出异常目录和实际限制

 

  • UnregisteredDatanodeException
  • This exception is thrown when a datanode that has not previously registered is trying to access the name node.
  • 这个异常是为了应对没有在NameNode 上注册的数据节点要进入NameNode 时抛出的异常,比如其他hadoop 集群部署。

 

org.apache.hadoop.hdfs.protocol

UML 图:

Eclipse Modeling Tools(Eclipse 建模工具)

过程:

  1. 安装UML2.0  链接==》》失败:在Eclipse/help/Install Detail 可以看到安装了UML 2.0 ,但new->other-> 没有UML 建模选项(安装方法:下载UML2.0 zip 包,features 内文件拷贝到eclipse features 包内,plugin 内文件拷贝到eclipse plugin 包)。
  2. 在stackoverflow 看到有说明UML2.0 在eclipse 3.6 之上版本不兼容。可以安装,过程比较复杂了,推荐papyrus 。
  3. 安装papyrus ,同过程一,安装链接 ==》》失败:在Eclipse/help/Install Detail 看不到安装的papyrus,且新建不了UML 文件。
  4. 在papyrus 链接 查看文档,里面提到的Eclipse Modeling Platform 图标无,故下载Eclipse Modeling Tools 安装,按文档提示安装papyrus,可用。

 

PS:感觉Eclipse 好处在于不用安装,即下即用,每次关闭Eclipse 都会保存project 文件读取位置,再次打开或者其他版本Eclipse 打开也能方便使用。

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启动过程详细剖析

 

HDFS—INode*

INode*.java 是用于描述目录、文件信息的类,如同我们之前讲到的我们提供给客户端透明的目录层次结构的访问方式,INode/INodeFile/INodeFileUnderConstruction/INodeDirectory/INodeDirectoryWithQuota 四个类,继承关系为:

INode

<<<==INodeFile<<<==INodeFileUnderConstruction(正在构建的文件)

<<<==INodeDirectory<<<==INodeDirectoryWithQuota(有容量限制的目录)

继续阅读