目录
1. Client:客户端
- 切分文件。文件上传HDFS时,客户端将文件切分成一个一个的block,然后进行存储
- 与NameNode交互,获取文件的位置信息
- 与DataNode交互,读取或写入数据
- 提供命令管理HDFS:启动关闭访问
2. NameNode:主节点
- 存储元数据信息,不存储具体数据
- 管理Block的映射信息
- 配置副本策略
- 处理客户端读写请求
2.1 如何保证NameNode的数据存储安全
NameNode HA:一个NameNode有单点故障问题,配置双NameNode
- 必须保证两个NameNode的元数据信息是同步的
- 一个NameNode挂掉之后另一个要立马补上
- 元数据信息同步在HA方案中采用的是“共享存储”。每次写文件时,需要将日志同步写入共享存储,这个步骤成功才能认定写文件成功。然后备份节点定期从共享存储同步日志,以便进行主备切换。
- 监控NameNode状态采用Zookeeper,两个NameNode节点的状态存放在Zookeeper中,另外两个NameNode节点分别有一个进程监控程序,实时读取Zookeeper中NameNode的状态,判断当前NameNode是不是已经挂掉,如果standby的NameNode节点发现主节点已经挂掉,那么就会强制给原来activate NameNode节点发送强制关闭请求,之后备用的NameNode设置为activate。
脑裂现象,节点发生“假死”现象,导致两个NameNode都处于active状态,都可以对外提供服务。
2.2 NameNode在启动时会做哪些操作
NameNode数据存储在内存和本地磁盘,本地磁盘数据存储在fsimage镜像文件和edits编辑日志文件
1)Fsimage文件:HDFS文件系统元数据的一个“永久性检查点”其中包含HDFS文件系统的所有目录和文件的inode的序列化信息。
2)Edits文件:edits 文件中存储的是文件系统元数据改变的信息
首次启动:
- 格式化文件系统,为了生成fsimage镜像文件
- 启动NameNode:
- 读取fsimage文件,将文件内容加载到内存
- 等待DataNode注册与发送block信息 - 启动DataNode:
- 向NameNode注册
- 发送block信息
- 检查fsimage中记录的块数量与DataNode的块数量是否相同 - 对文件系统进行操作
- 此时内存中已经有文件系统的改变信息,但磁盘中没有文件的改变信息,此时会将这些改变写入edits文件中
第二次启动
- 读取fsimage和edits文件
- 将fsimage和edits文件合并新的fsimage文件
- 创建新的edits文件
- 启动Datanode
3. DataNode:从节点
- NameNode下达命令,DataNode执行实际操作
- 存储实际数据块
- 执行数据块的读写操作
4. Secondary NameNode
- 辅助NameNode,分担其工作量
- 定期合并Fsimage和Edits,并推送给NameNode
- 在紧急情况下,可辅助恢复NameNode
如果NameNode元数据丢失,是可以从Secondary NameNode恢复一部分元数据信息,但不是全部,因为NameNode正在写的edit日志还没有拷贝到Secondary NameNode。