- HDFS的写流程:

- 客户端通过Distribute FileSystem模块向NameNode请求上传文件,NameNode检验客户端权限,然后检查目标文件是否已经存在,父目录是否纯在。
- NameNode返回是否可以上传文件
- 客户端请求上传第一个Block,请求NameNode返回应该上传到哪几个DateNode服务器上。
- NameNode根据副本存储规则,返回3个DataNode节点,分别为dn1、dn2、dn3。
- 客户端通过FSDataOutputStram模块请求dn1上传数据,dn1接到请求后会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
- dn1,dn2,dn3逐级给客户端做出应答。
- 客户端收到应答后,开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答响应队列。
- 当Block传输完成之后,客户端在其请求NameNode上传第二个Block的服务器。重复执行c-h步
- HDFS节点距离计算
- 节点距离:两个节点到大最近的共同祖先的距离总和。

- Hadoop3.1.3副本节点选择
- 第一个副本在Client所处的节点上。如果客户端在集群外,则随机选择一个
- 第二个副本在另一个机架的随以一个节点
- 第三个副本在第二个副本所在机架的随机节点
- HDFS的读流程:
- NameNode工作机制

- 第一阶段:
- 服务器启动,加载edits编辑日志和fsimage镜像文件到内存中。
- 客户端对元数据进行增删改操作,向NameNode提出请求。
- NameNode先记录操作日志,滚动更新日志,然后再在内存中对元数据进行增删改。
第二阶段:
- SecondaryNameNode询问NameNode是否需要CheckPoint,CheckPoint的触发条件是:①定时时间到②Edits中的数据满了。直接带回NameNode是否检查结果。
- 2NN请求执行CheckPoint。
- NameNode滚动正在写的操作日志,将edits_inprogress_001滚动为edits_inprogree_002,同时,如果此时有新的客户端请求操作,则记录在edits_001中。
- 将edits_inprogress_002和fsimage文件拷贝到2NN中
- 2NN加载操作日志和镜像文件到内存中,进行合并(根据初始数据和账本,开始清算)。
- 合并之后新生成一个fsimage_checkpoint文件,可以理解为执行操作日志中的操作时候得到的镜像文件。
- 将合并后的fsimage_checkpoint拷贝到NameNode中。
- 将NameNode中的fsimage_checkpoint重命名为fsimage。
Fsimage和Edits解析、
- Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode序列化信息。
- Edits文件:存放HDFS文件系统中所有变更操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
- seentxid文件保存的是一个数字,就是最后一个edits的数字。
- 正常情况是无法通过cat查看fsimage进行文件的
- 查看oiv和oev命令
- 基本语法:hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
- hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
CheckPoint时间设置
- 通常情况下,checkpoint每隔1小时执行一次,edits操作次数为1百万次。
修改:[hdfs-default.xml]

2NN怎么知道Edits中的操作是否到了1百万次呢?
- 每隔60查看一次NN中edits_inprogress中文件数有没有1百万次

