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

一、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、读数据

HDFS的存储结构以及写入、读取hdfs数据操作流程简单总结_第1张图片

2、写数据

HDFS的存储结构以及写入、读取hdfs数据操作流程简单总结_第2张图片

说明:当datanode完成一个数据块时,就向namenode进行汇报
写数据是按照packet(默认64K)来的,当完成一个packet时,就向dataNode发送数据
client调用flush操作时,不管是否达成一个packet的大小,都向dataNode发送数据
当然调用close操作,银行一个flush操作,并向NameNode进行汇报

你可能感兴趣的:(hadoop,hdfs)