首页 > 代码库 > HDFS

HDFS

1. HDFS体系结构

HDFS支持大文件,以流的方式访问数据,数据分布在数据节点(Data Node),文件的元数据保存在名字节点(Name Node)。名字节点的内存大小,决定了HDFS文件系统可保存的文件数量,所以大量小文件会影响名字节点的性能(尽管名字节点内存都较大)。

1.1 数据块Block

默认Block最大为64MB,Block的概念可以使HDFS支持保存比单一磁盘大的文件。

Block包含三个属性:blockId(唯一标识)、numBytes(块大小)、generationStamp(版本号、时间戳)

其中generationStamp用于数据一致性检查,每当数据块后成功添加数据后,都会更新generationStamp,blockId一样,但generationStamp不一样的,表示数据块有无效的。

blockId如果是12345,那么数据库名为blk_12345。

1.2 名字节点和第二名字节点

NameNode存储文件目录树,文件/目录的元信息及文件的数据块索引———NameNode第一关系。

  1. 命名空间镜像(File System Image,FSImage):保存某一特定时刻HDFS的NameNode状态。
  2. 命名空间镜像的编辑日志(Edit Log):存储FSImage后续的信息改动。

第二名字节点(Secondary NameNode,SNN)用于定期合并FSImage和Edit Log的辅助守护进程。合并好的FSImage会替换NameNode上的FSImage并清空Edit Log。

1.3 数据节点

DataNode守护进程:将HDFS Block写入Linux实际文件系统中,or 读取实际文件到HDFS Block。

对于类DatanodeID包含以下成员变量:

  1. name:字符串,ip(or主机名)与端口号对
  2. storageID:数据节点的存储标识,在NameNode注册时用。
  3. infoPort:WWW服务器的监听端口。
  4. ipcPort:IPC服务器监听端口,对于客户端而言,该接口提供了ClientDatanodeProtocol服务。

NameNode----(握手、注册、数据块上报、心跳)----DataNode

  • 握手:DataNodeProtocol.versionRequest()
  • 注册:DataNodeProtocol.register()
  • 上报:DataNodeProtocol.blockReport()
  • 心跳:DataNodeProtocol.sendHeartbeat()

1.4 客户端

包括命令行接口、Java API等。

与客户端相关的接口:ClientProtocol(NameNode)和ClientDatanodeProtocol。

HDFS