首页 > 代码库 > 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第一关系。
- 命名空间镜像(File System Image,FSImage):保存某一特定时刻HDFS的NameNode状态。
- 命名空间镜像的编辑日志(Edit Log):存储FSImage后续的信息改动。
第二名字节点(Secondary NameNode,SNN)用于定期合并FSImage和Edit Log的辅助守护进程。合并好的FSImage会替换NameNode上的FSImage并清空Edit Log。
1.3 数据节点
DataNode守护进程:将HDFS Block写入Linux实际文件系统中,or 读取实际文件到HDFS Block。
对于类DatanodeID包含以下成员变量:
- name:字符串,ip(or主机名)与端口号对
- storageID:数据节点的存储标识,在NameNode注册时用。
- infoPort:WWW服务器的监听端口。
- ipcPort:IPC服务器监听端口,对于客户端而言,该接口提供了ClientDatanodeProtocol服务。
NameNode----(握手、注册、数据块上报、心跳)----DataNode
- 握手:DataNodeProtocol.versionRequest()
- 注册:DataNodeProtocol.register()
- 上报:DataNodeProtocol.blockReport()
- 心跳:DataNodeProtocol.sendHeartbeat()
1.4 客户端
包括命令行接口、Java API等。
与客户端相关的接口:ClientProtocol(NameNode)和ClientDatanodeProtocol。
HDFS