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进行汇报
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进行汇报
相关文章推荐
- HDFS的存储结构以及操作流程简单总结
- ios开发系列之文件的写入读取,NSUserDefaults存储数据,NSFileManager操作文件和文件夹
- HDFS如何读取文件以及写入文件-加米谷大数据
- Mapreduce读取和写入Hbase(从A表读取数据,统计结果放入B表,非常详细,附有代码说明以及流程)
- java关于读取数据后简单写入一个文件中的总结
- Android数据读取 写入操作(SD卡文件存储、SharedPreferences存储)
- HDFS写入和读取流程
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- Java中最简单的把数据写入xml文件的方法----jdom之xml操作
- HDFS写入和读取流程
- 存储数据方法之一:NSUserDefaults 读取和写入
- WP7 XML操作详解:读取,过滤以及数据绑定
- WP7的XML操作详解:读取,过滤以及数据绑定
- HDFS写入和读取流程
- [经验总结]Perl读取Excel数据并调用MSXML接口操作XML数据
- HDFS写入和读取流程
- SQL 数据的导入导出,对远程(MSsql,OracleAccess,)数据库的操作以及读取Excel,txt文件中的数据
- Java操作Excel之理解JXL--读取Excel模板动态写入数据并生成Excel
- 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定
- 数据结构之线性表顺序存储的常用操作(转载)