节点距离:两个节点到达最近的共同祖先的距离综合
- 第一个副本在Client所处的节点上,如果Client在集群外,则随机选一个节点
- 第二个副本在另一个机架上的随机一个节点
- 第三个副本在第二个副本所在机架的随机节点
- 客户端通过Distributed FileSystem模块向NN请求上传文件
- NN会检查目标文件及其父目录是否存在,并返回是否可以上传
- 客户端请求第一个Block上传的具体位置(哪几个DN)
- NN返回三个DN节点
- Client通过FSDataOutputStream模块请求上传数据到DN1
- DN1收到请求会继续调用DN2,DN2调用DN3将这个通信管道建立完成,然后DN1、DN2、DN3逐级应答Client
- Client开始王DN1上传第一个以Packet为单位的Block,DN1收到一个Packet就会传给DN2,DN2传给DN3;DN1每传一个Packet会放一个应答队列等待应答
- 当一个Block传输完成后,Client再次请求NN上传第二个Block的服务器(重复3-7步)。
- 客户端通过DistributedFileSystem向NN请求下载文件,NN通过检查元数据,找到Block所在的DN地址
- Client通过就近原则挑选一台DN,请求读取数据
- DN开始从磁盘读取数据输入流,以Packet为单位传输数据给Client
- Client接收到Packet,先在本地缓存,然后写入目标文件
**NN的数据在磁盘和内存中都有存储。**内存存储是为了提高运行的效率,磁盘存储是为了数据的持久化。
FsImage:用来存储备份元数据的磁盘文件。Edits:用来保存元数据修改记录的磁盘文件,只做追加操作效率很高。
- 当NN节点断电或故障时,若其内部之前操作的元数据的结果丢失了,会通过FsImage和Edits的合并,合成元数据。
- 若一直向Edits中写入数据会导致过大,效率太低,而且恢复元数据时间过长,因此引入了2NN专门对FsImage和Edits进行合并
第一阶段:NN启动
- 第一次启动NN格式化后,会创建FsImage和Edits文件,若不是第一次启动,直接加载编辑日志和镜像文件到内存
- Client对元数据进行增删改的请求
- NN记录操作日志,定期落盘日志
- NN在内存中对元数据进行增删改
第二阶段:2NN工作
- 2NN询问NN是否需要合并FsImage和Edits文件
- 2NN请求执行合并
- NN落盘正在写的Edits日志,并同时创建一个新的Edits进行操作
- 将落盘的FsImage和Edits拷贝到2NN
- 2NN记载FsImage和Edits文件到内存,并合并生成新的fsimage.chkpoint
- 拷贝fsimage.chkpoint到NN,NN重新命名为FsImage
Fsimage:NameNode内存中元数据序列化后形成的文件。
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)。
- NameNode启动时,先滚动Edits并生成一个空的edits.inprogress,然后加载Edits和Fsimage到内存中,此时NameNode内存就持有最新的元数据信息。
- Client开始对NameNode发送元数据的增删改的请求,这些请求的操作首先会被记录到edits.inprogress中(查询元数据的操作不会被记录在Edits中,因为查询操作不会更改元数据信息)
- 如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改的操作。
- 由于Edits中记录的操作会越来越多,Edits文件会越来越大,导致NameNode在启动加载Edits时会很慢,所以需要对Edits和Fsimage进行合并(所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,最终形成新的Fsimage)。SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。
- SecondaryNameNode首先会询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了)。直接带回NameNode是否检查结果。
- SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits并生成一个空的edits.inprogress,滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地
- 然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给NameNode,重命名为Fsimage后替换掉原来的Fsimage。
- NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录在Fsimage中。
查看FsImage文件
# hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径 hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml
查看Edits文件
# hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径 hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml2.2 CheckPoint设置
默认情况下,2NN每个一小时执行一次
dfs.namenode.checkpoint.period 3600s
一分钟检查一次操作次数,当操作次数达到1百万时,2NN执行一次
3. 集群安全模式 3.1 基本流程dfs.namenode.checkpoint.txns 1000000 操作动作次数 dfs.namenode.checkpoint.check.period 60s 1分钟检查一次操作次数
- NN启动时,首先将Fsimage载入内存,并执行Edits各项操作,一旦在内存中成功建立文件系统元数据的映像,则会创建一个空的编辑日志。此时NN开始监听DN的请求。在这个过程中NN一直运行在安全模式,即NN的对于客户端来说是只读的。
- 系统中的数据是以Block列表的形式存储在DN中,在安全模式下,各个DN会向NN发送最新的快列表信息,NN了解到足够多的块位置信息后才可以运行文件系统。
- **若满足最小副本条件,NN会在30S之后就退出安全模式。**所谓最小副本条件就是整个文件系统99.9%的块满足最小副本级别(默认dfs.replication.min为1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NN不会进入安全模式
bin/hdfs dfsadmin -safemode get #查看安全模式状态 bin/hdfs dfsadmin -safemode enter #进入安全模式状态 bin/hdfs dfsadmin -safemode leave #离开安全模式状态 bin/hdfs dfsadmin -safemode wait #等待安全模式状态
当安全模式结束后,就推送文件到hdfs
#!/bin/bash hdfs dfsadmin -safemode wait hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /三、DN详解 1. 工作机制 1.1 工作流程
- 一个数据块在DN上以文件形式存储在磁盘上,包含了两个文件:一个是数据本身,一个是元数据(长度、校验和、时间戳等)
- DN启动后向NN注册,通过后周期性(默认1H)的向NN上报所有块消息
- 心跳每3s一次,心跳返回结果带有NN给DN的命令(如删除某个数据块)。若超过10min未收到某个DN的心跳,则认为该节点不可用
- DN进程死亡或者网络故障照成DN无法与NN通信
- NN不会立刻将该节点判定为死亡,而是要经过一段时间,这段时间称为超时时长
- HDFS默认超时时长为10min30s
2. 服役/退役新节点 2.1 服役新节点dfs.namenode.heartbeat.recheck-interval 300000 dfs.heartbeat.interval 3
-
修改静态IP和主机名称
-
将Hadoop的配置文件分发到新节点
-
删除原来HDFS文件系统留存的文件(data和logs),并格式化NN
-
直接启动DN,即可关联到集群
hdfs --daemon start datanode yarn --daemon start nodemanager
-
若数据不均衡,可以通过命令实现集群的再平衡
./start-balancer.sh
白名单和黑名单是Hadoop管理集群主机的一种机制
- 添加到白名单的主机节点,都允许访问NN,不在白名单的主机节点,都会被退出。
- 添加到黑名单的主机节点,不允许访问NN,会在数据迁移后退出。
- 实际情况下,白名单用于确定允许访问NameNode的DataNode节点,内容配置一般与workers文件内容一致。
- 黑名单用于在集群运行过程中退役DataNode节点。
配置白名单
-
在$HADOOP_HOME/etc/hadoop路径下创建whitelist文件
-
在whitelist文件中添加白名单主机节点
hadoop102 hadoop103 hadoop104 hadoop105
-
在配置文件中hdfs-site.xml,添加白名单文件
dfs.hosts /opt/module/hadoop-3.1.3/etc/hadoop/whitelist 分发配置文件及白名单文件
-
重新启动集群
my_cluster start
黑名单退役
-
在$HADOOP_HOME/etc/hadoop路径下创建blacklist文件
-
在blacklist文件中添加要退役的节点
hadoop105
-
在配置文件中hdfs-site.xml,添加黑名单文件
dfs.hosts.exclude /opt/module/hadoop-3.1.3/etc/hadoop/blacklist 分发文件
-
刷新NameNode和ResourceManager
hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes



