您的位置:首页 > 大数据 > Hadoop

HDFS的存储结构以及写入、读取hdfs数据操作流程简单总结

2015-04-12 21:57 811 查看
一、NameNode数据结构

1、物理结构

${dfs.name.dir}/current/{VERSION,edits,fsimage,fstime}

dfs.name.dir是一个目录列表,存储每个目录的镜像。VERSION文件是Java属性文件,包含运行HDFS的版本信息。

edits,是编辑日志文件。当客户断执行写操作的时,NameNode首先会在编辑日志中写下记录,并在内存中保存一个文件系统元数据,这个描述符会在编辑日志有了改动后更新。内存中的元数据用来提供读数据请求服务。

编辑日志会在每次成功操作之后,且成功代码尚未返回给客户端之前进行刷新和同步。对于要写入多个目录的操作,该写入流要刷新和同步到所有的副本上,这就保证了操作不会因故障丢失数据。

fsimage 是一个二进制文件,当中记录了HDFS中所有文件和目录的元数据信息,以及文件中块的相关信息

2、逻辑结构

a、NameNode加载FsImage到内存后,形成一个目录树的结构(FSDirectory,INode,INodeFile<BlockInfo[]>)

b、Datanode通过心跳,上报block信息,在NameNode中形成BlocksMap(Block-->DataNode的对应关系)

c、NameNode分配块到DataNode,在写文件块的过程中,出现错误,那么会由client或DataNode上报给NameNode,表示该块失效。NameNode保存在CorruptReplicationMap中

d、在DataNode处于退役阶段、离开安全模式等阶段时,需要检查该DataNode的blocks的数量是否达到复制因子的要求,没有则加入需要复制的请求队列UnderReplicatedBlocks

e、保存正在复制的数据块的信息,PendingReplicationBlocks

f、当一个DataNode失效恢复后,因数据块太多,需要删除的块信息保存在excessReplicateMap

g、客户端写文件需要lease,超时需要剔除,该lease信息保存在NameNode上。

二、DataNode

1、物理数据结构

${dfs.data.dir}/current/VERSION

/blk_<id_1>

/blk_<id_1>.meta

/blk_<id_1>

/blk_<id_1>.meta

/...

/blk_<id_64>

/blk_<id_64>.meta

/subdir0/

/subdir1/

/...

/subdir63/

/previous/

/detach/

/tmp/

/in_use.lock

/storage

current是当前的工作目录,previous是升级HDFS之前的工作目录,在升级时,HDFS并不会将文件从previous拷贝到current目录中,而是遍历previous中的所有文件,在current目录中创建硬链接。

detach目录保存用于copy-on-write的文件,在Datanode重启时需要恢复。

tmp目录保存一些临时数据。

in_use.lock文件用于对datanode加锁,storage文件保存了布局版本及升级版本提示信息。

下面来看current目录的结构,目录中的文件都有blk_前缀,有两类文件:块文件和块元数据文件(.meta后缀)。当目录中数据块的数量增加到64个(由dfs.datanode.numblocks属性设置,子目录的数量也是由该属性设置),datanode会创建一个子目录来存放新的数据。采用树状结构的组织方式,datanode可以有效管理各个目录中的文件,避免将很多文件放在一个目录之中。

2、逻辑结构

三、协议接口

ClientProtocol:client--->NameNode,表示client和NameNode之间的通信,主要有以下操作

(create、append、setReplication、setPermission、addBlock、setOwner、rename、delete、mkdirs、getListing)

DataNodeProtocol:dataNode--->namenode,表示datanode和namenode之间的通信,主要有以下操作

(register、sendHeartBeat、blockReport、blockReceived、reportBadBlocks)

NameNodeProtocol:secondNameNode--->NameNode表示secondryNameNode和NameNode之间的通信(用于checkpoint,fsimage的备份用)

四、读写操作流程

1、读数据



2、写数据



说明:当datanode完成一个数据块时,就向namenode进行汇报

写数据是按照packet(默认64K)来的,当完成一个packet时,就向dataNode发送数据

client调用flush操作时,不管是否达成一个packet的大小,都向dataNode发送数据

当然调用close操作,银行一个flush操作,并向NameNode进行汇报
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐