Hadoop之HDFS(三)重要概念及原理
NameNode的数据保存位置
元数据需要存放在内存中
NameNode的持久化
NameNode数据存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。但是,如果一旦长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。
SencodaryNameNode
- 现存的NameNode面临的问题
问题
① 单点故障数据丢失?
② 日志持久化,容量大,回复慢
③ 快照持久化,短期内数据丢失问题依然存在。
④ 快照从哪儿来,合并的操作由谁做?
现有的持久化机制的特点
持久化机制Redis(类比)Hadoop-NameNode优点缺点日志增量AOFEditsLog数据**
安全性高
**冗余度高、数据恢复慢快照RDBFSImage数据**恢复快
**、占用空间小只保留数据的最终状态,快照间隔期见,数据可能丢失,安全性低
- NameNode持久化原理
简介
① NameNode持久化的时候使用的是EditsLog文件,保障数据安全。
② SencodaryNameNode负责定期将EditsLog中的数据,合并成FSImage的数据状态。(NameNode的助理,负责持久化文件的合并—
checkpoint
)③ NameNode恢复持久化到内存时,从FSImage恢复,外加从最近合并后产生EdisLog恢复,保障数据加载速度快。
SecondaryNameNode工作(面试)
CheckPoint原理过程
checkpoint:editslog和FSImage的合并过程
1. SecondaryNameNode向NameNode发起合并请求
2. NameNode将当前的Editslog文件保存改名edits,并新建EditsLog继续持久化工作。
3. 将改名后的edits文件和本地的FSImage(旧)发送给sencondaryNameNode
4. SecondaryNameNode负责将FSImage(旧)+edits文件合并成FSImage(新)
5. 将新的FSImage(新)发送给NameNode保存。
Checkpoint时机
1. 每隔1小时触发一次checkPoint 2. 每100w次操作,触发一次checkpoint 每1分钟检查一次,操作次数
设置时机:
hdfs-site.xml
namevalue默认含义dfs.namenode.checkpoint.period36003600秒触发一次dfs.namenode.checkpoint.txns1000000100w次操作触发一次dfs.namenode.checkpoint.check.period601分钟检查一次操作次数
secondary定制(了解)
- 默认secondary在namenode所在的机器
- 位置查看 hdfs-site.xml
dfs.namenode.secondary.http-address=0.0.0.0:50090
dfs.namenode.secondary.https-address=0.0.0.0:50091
- 单独启动secondaryNameNode命令
hadoop-deamon start secondarynamenode
- 指定192.168.199.100为secondarynamenode的机器
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.199.100:50090</value>
</property>
<property>
<name>dfs.namenode.secondary.https-address</name>
<value>192.168.199.100:50091</value>
</property>
DataNode工作机制
序号步骤事情0启动NameNode启动时,会启动slaves中所有的datanode1注册DataNode向NameNode注册信息:block数据状态、元数据、校验和、心跳。告诉NameNode自己工作正常,数据完整。2周期上报每隔1小时,会上报所有的block的元数据,校验和。3心跳每3秒向namenode发送一次心跳,namenode返回心跳结果并包含一些数据操作的命令,如果发现datanode10分钟内没有心跳,则认为该datanode节点不可用
总结
核心服务
- Namenode
① 作为HDFS分布式文件系统的master主机,统领所有datanode;
② 接收client的访问:hdfs协议和http协议;
③ 保存了元数据:文件名 路径 大小 所有者 所属组 权限 修改时间 副本数 块与datanode映射关系(通过这个才能到对应datanode获得真正的数据);
④ 数据保存在内存中。
⑤ 保存元数据的持久化信息:FsImage和editslog数据。
- DateNode
① 存储真正的数据的Block 单个最大128M
② block的元数据、checksum和编号。
③ 心跳,向NameNode汇报当前节点的健康状态。(没心跳,则标记宕机)
④ 周期汇报datanode的所有block的校验和等数据,确保数据的正确性。
- Client
① 可以是命令行可以使java程序。
② client访问namenode确定数据相关信息以及是否存在(如果存在就返回已经存在)。
③ client真正操作数据会与所有的datanode直接通信。
上传,会与最近的datanode通信。
下载,会与所有存储了block的datanode通信。
- SecondaryNameNode
① NameNode持久化助理,代替NameNode完成FSImage和Editslog的合并过程。(checkpoint)
关键数据
- FSImage
① 完整的集群下的所有block数据的元数据。
- Editslog
① 保存了每一次HDFS的文件操作的日志信息。