HDFS元数据
元数据 按类型分
- 文件, 目录自身的属性信息
- 文件的存储块信息 分块情况 副本个数
- DN的信息
元数据 按形式分
- 内存元数据
- 包含hdfs最完整的数据
- 磁盘元数据
- fsimage镜像文件
- 包含hdfs的所有目录和文件元数据信息, 但不包括文件块位置的信息, 文件块位置信息只存储在内存中, DN加入集群时, 汇报自己所拥有的块信息给NN, 并且一直更新
- edits编辑日志
- 包含hdfs的所有事务操作(文件的创建删除修改)
- 客户端执行的更改操作首先被记录到edits文件中
当客户端对 HDFS 中的文件进行新增或者修改操作,操作记录首先被记入 edits 日志文件中,当客户端操作成功后,相应的元数据会更新到内存元数据中。因为 fsimage 文件一般都很大(GB 级别的很常见),如果所有的更新操作都往 fsimage 文件中添加,这样会导致系统运行的十分缓慢。
HDFS重启流程
- 首先加载fsimage文件
- 然后回放fsimage之后生成的( 根据事务编号进行比对)editslog文件
- 等待DN注册汇报
Secondary Namenode
SNN的职责 : 合并namenode的edits log文件到fsimage中
合并流程
- 有 dfs.namenode.checkpoint.period (两次checkpoint的时间间隔 默认1小时)和 dfs.namenode.checkpoint.txns (最大的没有执行事务的数量 默认为100W)两个配置,只要达到这两个条件任何一个,secondarynamenode 就会执行 checkpoint 的操作
- 当触发 checkpoint 操作时,NameNode 会生成一个新的 edits 即上图中的 edits.new 文件,同时 SecondaryNameNode 会将 edits 文件和 fsimage 复制到本地(HTTP GET 方式)
- secondarynamenode 将下载下来的 fsimage 载入到内存,然后一条一条地执行 edits 文件中的各项更新操作,使得内存中的 fsimage 保存最新,这个过程就是edits 和fsimage文件合并,生成一个新的 fsimage 文件即上图中的 Fsimage.ckpt 文件。
- secondarynamenode 将新生成的 Fsimage.ckpt 文件复制到 NameNode 节点。
- 在 NameNode 节点的 edits.new 文件和 Fsimage.ckpt 文件会替换掉原来的 edits 文件和 fsimage 文件,至此刚好是一个轮回,即在 NameNode 中又是 edits 和 fsimage 文件。
HDFS安全模式
安全模式是 HDFS 所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求,是一种保护机制,用于保证集群中的数据块的安全性。
在NameNode主节点启动时,HDFS首先进入安全模式,集群会开始检查数据块的完整性。DataNode 在启动的时候会向 namenode 汇报可用的 block 信息,当整个系统达到安全标准时,HDFS 自动离开安全模式。
假设我们设置的副本数(即参数 dfs.replication)是 5,那么在 Datanode 上就应该有5 个副本存在,假设只存在 3 个副本,那么比例就是 3/5=0.6。在配置文件 hdfs-default.xml中定义了一个最小的副本的副本率(即参数 dfs.namenode.safemode.threshold-pct)0.999。
我们的副本率 0.6 明显小于 0.99,因此系统会自动的复制副本到其他的 DataNode,使得副本率不小于 0.999.如果系统中有 8 个副本,超过我们设定的 5 个副本,那么系统也会删除多余的 3 个副本。
如果 HDFS 处于 安全模式下, 不允许 HDFS 客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹,修改副本数等操作。相关配置
- dfs.namenode.replication.min: 每个数据块最小副本数量,默认为 1. 在上传文件时,达到最小副本数,就认为上传是成功的。
- dfs.namenode.safemode.threshold-pct:达到最小副本数的数据块的百分比。默认为0.999f。当小于这个比例,那就将系统切换成安全模式,对数据块进行复制;当大于该比例时,就离开安全模式,说明系统有足够的数据块副本数,可以对外提供服务。
- dfs.namenode.safemode.min.datanodes: 离开安全模式的最小可用 datanode 数量要求,默认为 0.也就是即使所有 datanode 都不可用,仍然可以离开安全模式。
- dfs.namenode.safemode.extension: 当block和datanode都满足时, 集群离开安全模式默认为30000毫秒
shell命令
- hdfs dfsadmin -safemode enter 进入安全模式
- hdfs dfsadmin -safemode leave 离开安全模式
- hdfs dfsadmin -safemode get 查看是否处于安全模式