首先,我们需要思考NameNode中的元数据是存储在什么中?是内存中还是磁盘中呢?显然如果只存在内存中的话,一旦断电,元素据就丢失了,整个集群就无法工作。如果存在NN节点的磁盘中话,因为需要进行随机访问,还要响应客户请求,效率必然会很低。因此元数据在内存上工作的同时,会在磁盘中备份元数据的一个镜像 FsImage,这样既能保证高效的工作,又能保证数据的安全。但是这样的话又会带来新的问题,我们不妨想象一下内存中的元数据如果在频繁的更新,那我们的FsImage也会同时更新吗?这时效率很低的。如果不更新,那这个备份就没有意义了,一旦断电,元数据仍然会丢失。因此我们在这里引入了Edits文件,修改日志。那么修改日志又承担了怎样的责任呢。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中,只进行追加操作,效率很高。也就是说Edits文件会记录内存中的元数据是如何变化的。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。如果NN自己负责合成的话,任然会导致效率很低,所以这时后2NN就会登场,Edits和FsImage都会拷贝到2NN中,2NN负责合成 (所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,最终形成新的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中。
集群的安全模式,就是在在集群启动时的一个保护机制。集群启动时主要涉及到 NameNode 和 DataNode。集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
NameNode启动时,首先会将Fsimage载入内存,并执行Edits中各项操作 (确保载入内存的是最新的元数据,因为可能没达到checkpoint的Edits和Fsimage还没有传入到2NN,所以用自己存在磁盘中的最新的 ),只有到达checkpoint以后,一份完整的Fsiamge和Edits才会传入2NN。一旦在内存中成功建立文件系统的元数据映像,则创建一个新的Fsimage文件和一个空的编辑日志。此是NameNode开始监听DataNode请求。这个过程期间,NameNode一直运行在安全模式中,NameNode的文件系统对于客户端来说只能读和下载不能修改。
当DataNode启动时,NameNode才能通过DataNode的反馈得到我们存储的数据的信息。因为数据是以数据块的形式存储在DataNode中的。只能当DataNode启动后,才能对数据进行修改操作。
当DataNode向NameNode反馈时,如果发现丢失超过两个数据块,安全模式则无法自动退出。如果满足“最小副本条件”,NameNode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式。
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
NameNode 的本地目录可以配置成多个,且每个目录存放的内容相同,增加可靠性。注意每个目录存放的内容相同。 DataNode也可以配置多个目录,且每个目录存放的内容不同。每个目录存储的数据不一样。即:数据不是副本
一个数据块在DataNode上以文件的形式存储在磁盘上,包括两个文件,一个时是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。-------(数据文件,校验文件,时间戳)校验数据的完整性。
DateNode启动后回向NameNode注册,通过后,每1个小时的向NameNode上报所有的块信(DateNode在启动时会立即向NameNode汇报一次数据块信息。用来确定安全模式的退出)。
心跳每3秒一次,心跳返回结果带有NameNode给DataNode的指令(比如删除,复制数据块),如果超过10分30秒没有收到某个DataNode的心跳,则认为该结点不可用。
当DataNode收到客户端请求访问数据以后。DataNode在读取Block数据块时,会计算CheckSum,当计算后的值如Block创建时的值不一样,则会认为Block已经损坏,Client读取其他DataNode上的Block。
也就是说,当客户端请求访问数据块是,DataNode会查看Block是否完整,完整后再返回。
通过crc校验算法检查其完整性。
1)需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
2)环境准备
(1)在hadoop104主机上再克隆一台hadoop105主机
(2)修改IP地址和主机名称
(3)删除原来HDFS文件系统留存的文件(/opt/module/hadoop-3.1.3/data和logs)
(4)source一下配置文件
克隆-------修改主机名和IP------删除克隆机的logs和data文件----source配置文件
source配置文件:source /etc/profile
单点启动:hdfs -daemon start datanode
yarn -daemon start nodemanager
白名单和黑名单是hadoop管理集群主机的一种机制。
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被退出。
添加到黑名单的主机节点,不允许访问NameNode,会在数据迁移后退出。
实际情况下,白名单用于确定允许访问NameNode的DataNode节点,内容配置一般与workers文件内容一致。 黑名单用于在集群运行过程中退役DataNode节点。
配置白名单和黑名单的具体步骤如下:
1)在NameNode节点的/opt/module/hadoop-3.1.3/etc/hadoop目录下分别创建whitelist 和 blacklist文件,touch whitelist, touch blacklist
在whitelist中添加如下主机名称,假如集群正常工作的节点为102 103 104 105
hadoop102
hadoop103
hadoop104
hadoop105
2)在hdfs-site.xml配置文件中增加dfs.hosts和 dfs.hosts.exclude配置参数
dfs.hosts
/opt/module/hadoop-3.1.3/etc/hadoop/whitelist
dfs.hosts.exclude
/opt/module/hadoop-3.1.3/etc/hadoop/blacklist
分发配置文件whitelist,blacklist,hdfs-site.xml (注意:105节点也要发一份)
3)分发配置文件whitelist,blacklist,hdfs-site.xml (注意:105节点也要发一份)
[william@hadoop102 etc]$ xsync hadoop/
[william@hadoop102 etc]$ rsync -av hadoop/ william@hadoop105:/opt/module/hadoop-3.1.3/etc/hadoop/
重新启动集群(注意:105节点没有添加到workers,因此要单独起停)
hdfs –daemon start datanode