与数据块相关
数据块:在 HDFS 中抽象为 block,block 包含三个成员变量:blockId,numbytes(数据块大小),generationStamp(数据块版本号,每次对数据块的修改版本号都会跟着修改,用于数据一致性检查,具有相同 blockId 但版本号不同的数据块至少有一个是无效的,需要删除),数据块的名称是 blk_<blockId>
LocateBlock:已经确定了存储位置的数据块,成员变量有:Block、数据块所在节点信息 locs、数据块在对应文件中的偏移量。Locs 是一个类型为 DataNodeIndo 的数组,包含了所有可用的数据块位置
locatedBlocks:可用于一次定位多个 block,包含一系列的 locatedBlock 对象
BlockLocalPathInfo:用于 HDFS 数据块本地读优化,当数据块与客户端位于同一台机器时,不通过数据节点读数据,而是直接本地读
与 DataNode 相关:DataNodeID、DataNodeInfo
DataNodeID:用于在集群中唯一确定某一数据节点。可以从中获得数据节点的主机地址
DataNodeInfo:提供附加状态信息,包括容量,已使用流量,剩余流量,数据节点在集群中的位置,数据节点状态等信息
HDFS 的安全模式
当 namenode 刚启动时会进入安全模式,具体顺序是首先将 fsimage 载入内存,并执行 editLog 中的操作。一旦文件系统元数据创建成功,便会创建一个空的 editLog。此时 nameNode 开始监听 RPC 和 Http 请求。但是此时 namenode 处于安全模式,只接收客户端的读操作。
fsImage 与 Editlog
fsimage 存储的都是文件系统元数据信息(文件及目录结构,组成文件的块的信息,副本数量信息),是文件元数据信息的持久性检查点,当 namenode 重启后都需要载入 fsimage 进入内存,恢复到某一检查点,再执行检查点后的编辑日志(editlog),进行重建。 检查点之后的操作记录会保存到 editlog 中,注意 editlog 存储的是操作记录而并非元数据,当 fsimage 与 editlog 合并时,会先将 editlog 执行一遍,生成元数据信息再与 fsimage 合并,每次合并后的位置就称为检查点
hdfs 中的接口类型
Rpc协议就是Server实现一个声明了很多方法的接口并对外暴露此接口,Client通过调用此接口中声明的方法向server发送信息从而实现了与server的通信
HDFS 中的接口主要包括三种类型:
简述 zookeeper 及 ZAB 协议
Zookeeper 简介
Zookeeper 为分布式应用提供了一个高效可靠的分布式协调服务。实现依赖于 ZAB 协议,实现了一种主备模式的架构来保持集群中数据的一致性。Zookeeper 使得分布式应用可以通过一个共享的树形结构的命名空间实现协调。Zookeeper 的所有数据都存储再内存中。Zookeeper 集群中的任何一台机器都可以响应客户端的读操作,且全量数据存储在内存中,因此 Zookeeper 更适合以读操作为主的应用场景。