读写机制
写操作
在向 NameNode 写文件时,首先由客户端向 NameNode 发起文件上传请求,NameNode 检查文件要上传的目录,并鉴权。
如果上传用户对此目录有权限,则允许客户端进行上传操作。客户端接收到允许指令后,将要上传的文件切分为 Block,之后按照顺序依次上传 block1、block2……block N,这也是为什么说 HDFS 无法进行并发写的原因。
首先上传 block1,向 NameNode 发起请求,NameNode 会按照 block 副本放置策略,为 block1 选择合适的 DataNode 节点,并按照与客户端的路由由近到远的顺序进行排序,之后将 DataNode 列表返回给客户端。
客户端接收到 DataNode 列表后,便按照列表顺序(由近到远),依次与 DataNode 建立管道连接,首先将 block1 发送到最近的 DataNode 中,当数据写入到 DataNode 内存时,当前 DataNode 会将数据通过管道分发到第二个 DataNode 节点,以此类推。
当最后一个 DataNode 接收到数据之后,便通过管道依次向上返回成功信息。客户端接收到成功信息后,便向 NameNode 报告 block1 写入成功,然后按照此步骤,依次存储剩余的 block。
所有的 block 存储完成后,NameNode 会在内存中生成文件所对应的元数据,提供数据查询功能。
读操作
读取操作相对较为简单,客户端首先向 NameNode 发起读取文件的请求,NameNode 鉴定用户权限。如果用户对文件有读取权限,则查询文件的元数据信息,将文件块的组成和存储位置按照与客户端的路由距离由近到远排序后返回给客户端。
客户端接收到 NameNode 的返回后,依次与最近的 DataNode 进行连接,读取 block 数据,此时可以并发读取。所有的 block 读取完成后,便在客户端中,将 block 组装成文件,返回给用户。
安全模式
什么是安全模式
安全模式是 HDFS 的一种特殊状态,在这种状态下,HDFS 只接收读数据请求,而不接收写入、删除、修改等变更请求。它是 HDFS 确保集群安全的一种保护机制, NameNode 如果检测到任何异常,便会进入到安全模式,直到问题解决。
触发安全模式的原因
1. DataNode 主动向 NameNode 汇报可用 Block 列表等信息,当 Block 上报率 <= 阈值时(默认阈值为 0.999),会处于安全模式。
假设 HDFS 中存储有 1000 个 Block 块,现在所有的 DataNode 只汇报给 NameNode 90 个 Block 的位置信息,那么 HDFS 会认为系统处于异常状态,为了保证系统的安全性,此时 HDFS 只允许读取,而不允许写入。
默认情况下,当 Block 的上报率(DataNode 上报的可用 Block 个数/NameNode 元数据记录的 Block 个数)小于 0.999 时,便会进入安全模式,这个阈值允许按照不同的生产情况进行修改。
造成上报率缺失的常见情况有:NameNode 重启、DataNode 无法正常启动。当 NameNode 重启后,因为 Block 位置信息不会持久化到磁盘,被清空,在等待 DataNode 逐渐上报的过程中,且达到阈值之前会一直处于安全模式。而 DataNode 无法正常启动,也会造成当前节点的 Block 信息丢失。
当 Block 上报率 >= 阈值时,HDFS 才能离开安全模式,默认阈值为 0.999。也可以使用命令强制退出安全模式,但不推荐,数据已经缺失,此操作可能造成文件丢失的风险。
2. 元数据出现不一致情况
当元数据文件被用户手动修改,数据回滚导致元数据替换,用户强制关机导致元数据丢失,或者 NameNode 磁盘空间不足导致元数据无法持久化保存,都会导致 HDFS 进入安全模式。
3. 日志中出现严重异常
4. 管理员手动进入安全模式
如何正常离开安全模式
排查集群进入安全模式的原因,对症下药。
因为上报率的缺失,则排查 Block 信息缺失原因,等待集群 Block 信息上报、手动恢复宕机的 DataNode,当 Block 上报率 >= 阈值时,HDFS 会自动退出安全模式。
元数据出现损坏,则恢复元数据后,自动或手动退出安全模式。如果是 NameNode 磁盘空间不足,清理 NameNode 磁盘后,会自动退出安全模式。
其它集群报错问题,解决集群报错后,自动退出。
但如果是管理员手动进入安全模式后,只能手动通过命令退出安全模式。