第一个关系即目录树、元数据和数据块的索引信息会 持久化到物理存储 中,实现是保存在命名空间的镜像 fsimage 和编辑 日志edits 中, 注意: 在fsimage中, 并没有记录每一个block对应到哪几个Datanodes的对应表信息
第二个关系是在NameNode启动后,每个Datanode对本地磁盘进行扫描,将 本Datanode上保存的block信息汇报给Namenode ,Namenode在接收到每个Datanode的块信息汇报后,将接收到的块信息,以及其所在的Datanode信息等保存在内存中。HDFS就是通过这种块信息汇报的方式来 完成 block -> Datanodes list的对应表构建
fsimage 记录了自最后一次检查点之前HDFS文件系统中所有目录和文件的序列化信息;
edits 是元数据操作日志(记录每次保存fsimage之后到下次保存之间的所有hdfs操作)
在NameNode启动时候,会先将fsimage中的文件系统元数据信息 加载到内存 ,然后根据eidts中的记录将内存中的元数据 同步至最新状态, 将这个新版本的 FsImage 从内存中保存到本地磁盘上,然后删除 旧的 Editlog,这个过程称为一个 检查 点(checkpoint), 多长时间做一次 checkpoint?( 见第四章 参数配置 ) checkpoint 能手工触发吗? 验证重启hdfs服务后editlog没删除呢?
类似于���据库中的检查点,为了避免edits日志过大,在Hadoop1.X中,SecondaryNameNode会按照时间阈值(比如24小时)或者edits大小阈值(比如1G),周期性的将fsimage和edits的合并,然后将最新的fsimage推送给NameNode。而在Hadoop2.X中,这个动作是由Standby NameNode来完成 .
由此可看出,这两个文件一旦损坏或丢失,将导致整个HDFS文件系统不可用,在HDP2.4安装(五):集群及组件安装 集 群安装过程中,hdfs 默认的只能选择一个NN,是否意味着 NN存在单点呢?( 见第二单 hdfs HA)
在hadoop1.X为了保证这两种元数据文件的高可用性,一般的做法,将 dfs.namenode.name.dir设置成以逗号分隔的多个目录 ,这多个目录至少不要在一块磁盘上,最好放在不同的机器上,比如:挂载一个共享文件系统
fsimage\edits 是序列化后的文件,想要查看或编辑里面的内容,可通过 hdfs 提供的 oiv\oev 命令,如下:
命令: hdfs oiv (offline image viewer) 用于将fsimage文件的内容转储到指定文件中以便于阅读, ,如文本文件、XML文件,该命令需要以下参数:
命令: hdfs oev (offline edits viewer 离线edits查看器)的缩写, 该工具只操作文件因而并不需要hadoop集群处于运行状态。
小结:
NameNode管理着DataNode,接收DataNode的注册、心跳、数据块提交等信息的上报,并且在心跳中发送数据块复制、删除、恢复等指令;同时,NameNode还为客户端对文件系统目录树的操作和对文件数据读写、对HDFS系统进行管理提供支持
Namenode 启动后会进入一个称为 安全模式 的特殊状态。处于安全模式 的 Namenode 是不会进行数据块的复制的。 Namenode 从所有的 Datanode 接收心跳信号和块状态报告 。块状态报告包括了某个 Datanode 所有的数据 块列表。每个数据块都有一个指定的最小副本数。当 Namenode 检测确认某 个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全 (safely replicated) 的;在一定百分比(这个参数可配置)的数据块被 Namenode 检测确认是安全之后(加上一个额外的 30 秒等待时间), Namenode 将退出安全模式状态。接下来它会确定还有哪些数据块的副本没 有达到指定数目,并将这些数据块复制到其他 Datanode 上。
Secondary NameNode: 在HA cluster中又称为standby node
定期合并 fsimage 和 edits 日志,将 edits 日志文件大小控制在一个限度下
namenode 响应 Secondary namenode 请求,将 edit log 推送给 Secondary namenode , 开始重新写一个新的 edit log
Secondary namenode 收到来自 namenode 的 fsimage 文件和 edit log
Secondary namenode 将 fsimage 加载到内存,应用 edit log , 并生成一 个新的 fsimage 文件
Secondary namenode 将新的 fsimage 推送给 Namenode
Namenode 用新的 fsimage 取代旧的 fsimage , 在 fstime 文件中记下检查 点发生的时
HDFS写文件:
写文件部分参考blog 地址 ( http://www.linuxidc.com/Linux/2016-09/134882.htm ),2.X版本默认block的大小是 128M (见第四章参数配置)