![](https://csdnimg.cn/release/download_crawler_static/87234940/bg4.jpg)
HDFS 的命名空间是由名字节点来存储的。名字节点使用叫做 EditLog 的事务日志来持久记录每一个对
文件系统元数据的改变,如在 HDFS 中创建一个新的文件,名字节点将会在 EditLog 中插入一条记录来记录
这个改变。类似地,改变文件的复制因子也会向 EditLog 中插入一条记录。名字节点在本地文件系统中用一
个文件来存储这个 EditLog。整个文件系统命名空间,包括文件块的映射表和文件系统的配置都存在一个叫
FsImage 的文件中,FsImage 也存放在名字节点的本地文件系统中。
名字节点在内存中保留一个完整的文件系统命名空间和文件块的映射表的镜像。这个元数据被设计成
紧凑的,这样 4GB 内存的名字节点就足以处理非常大的文件数和目录。名字节点启动时,它将从磁盘中读
取 FsImage 和 EditLog,将 EditLog 中的所有事务应用到 FsImage 的仿内存空间,然后将新的 FsImage 刷新到
本地磁盘中,因为事务已经被处理并已经持久化的 FsImage 中,然后就可以截去旧的 EditLog。这个过程叫
做检查点。当前实现中,检查点仅在名字节点启动的时候发生,正在支持周期性的检查点。
数据节点将 HDFS 数据存储到本地的文件系统中。数据节点并不知道 HDFS 文件的存在,它在本地文
件系统中以单独的文件存储每一个 HDFS 文件的数据块。数据节点不会将所有的数据块文件存放到同一个
目录中,而是启发式的检测每一个目录的最优文件数,并在适当的时候创建子目录。在本地同一个目录下
创建所有的数据块文件不是最优的,因为本地文件系统可能不支持单个目录下巨额文件的高效操作。当数
据节点启动的时候,它将扫描它的本地文件系统,根据本地的文件产生一个所有 HDFS 数据块的列表并报
告给名字节点,这个报告称作块报告。
通信协议
所有的通信协议都是在 TCP/IP 协议之上构建的。一个客户端和指定 TCP 配置端口的名字节点建立连
接之后,它和名字节点之间通信的协议是 Client Protocal。数据节点和名字节点之间通过 Datanode Protocol
通信。
RPC(Remote Procedure Call)抽象地封装了 Client Protocol 和 DataNode Protocol 协议。按照设计,名字
节点不会主动发起一个 RPC,它只是被动地对数据节点和客户端发起的 RPC 作出反馈。
异常处理编辑
鲁棒性
HDFS 的主要目标就是在存在故障的情况下也能可靠地存储数据。三个最常见的故障是名字节点故障,
数据节点故障和网络断开。
重新复制
一个数据节点周期性发送一个心跳包到名字节点。网络断开会造成一组数据节点子集和名字节点失去
联系。名字节点根据缺失的心跳信息判断故障情况。名字节点将这些数据节点标记为死亡状态,不再将新
的 IO 请求转发到这些数据节点上,这些数据节点上的数据将对 HDFS 不再可用,可能会导致一些块的复制
因子降低到指定的值。