分布式存储--HDFS原理
思维导图:
一、NameNode
-
接收客户端的请求
-
管理元数据(文件上传时间、文件权限、文件属主、大文件的block数及blockId号)
-
管理集群
二、SecondaryNameNode
持久化内存中的元数据。
因为内存不稳定,可以将数据持久化到磁盘上。
若nameNode进行持久化,会造成nameNode负载太高,集群不可用。所以将持久化的工作交给SecondaryNameNode(NameNode的助理)去做。
持久化的详细过程:
NameNode启动的时候会创建两个文件:edit(日志文件)和fsimage
触发合并条件后,将edit和fsimage拉到secondNameNode中,之后会根据edit里面的操作进行重演(产生相同的元数据),重演之后将元数据写在fsimage中,产生的fsimageckpt推给namenode。
为了防止持久化的数据丢失,在重演过程中对edit文件的改变写到edit.new中。重演结束后,edit.new改名为edit
合并触发机制:1、超过3600毫秒
2、edit文件超过64m
并不是所有的元数据都会持久化:
除了block的位置信息,其他的元数据都会持久化(block的位置变动频率高、变动大)
这样的话,当HDFS集群重启,namenode中的元数据就会有所缺失无法对外提供服务
解决方案:HDFS启动的时候,所有的DN都会向NN汇报当前节点的block信息
三、DataNode
- 存储源数据,以block块的形式存储
- 接收客户端的读请求
四、写的流程
1、如果要上传一个大文件,client进行切割、计算大文件的block数
2、Client对nameNode进行汇报:
1)、当前大数据文件的block数
2)、权限
3)、上传时间
for(Block block:blocks){
3、client切割出来一个block
4、Client请求block块的id号及地址
5、因为nameNode能够掌控全局、那么他将负载不高的DataNode地址返回给client
6、Client拿到地址后去找到该DataNode,上传该block的数据(下面有client向dataNode传数据的详细流程)
7、DataNode将block存储完成后会想nameNode汇报存储情况
}
Client向DataNode写数据的详细流程
NameNode返回给client一批地址以后,这些DataNode之间会形成一个pipeline管道。Block切割成一个个packet以后以流的形式源源不断的发送
五、读的流程
客户端向namenode发起请求,namenode将block块的地址返回给客户端,然后客户端去请求响应的datanode。
六、备份机制
集群的dataNode节点数要大于等于副本数+1。
集群外提交:客户端,是外人。集群内提交:dataNode节点作为客户端进行提交(不提倡,有网络io问题)
1、第一个block存储在一个负载不是很高的服务器上。
2、第一个备份存储在与第一个block不同机架的随机的一个服务器上
3、第二个备份存储在与第一个备份相同的机架的随机服务器上。
4、 其他备份可以随机
七、权限
依据系统的用户系统,防君子
八、安全模式
1、加载fsimage,加载到内存中
2、如果edits文件不为空,那么nameNode自己来合并
3、检查DataNode的健康状况
4、如果有DataNode挂掉了,指挥做备份
九、大数据概述
大数据简介:短时间内快速的产生海量的各种各样的有价值的数据。
大数据技术:
1、分布式存储
2、分布式计算
分布式批处理(攒一段时间的数据,在某个时间统一处理)
分布式流处理(每产生一条数据,立即处理)
3、机器学习(预测类的需求需要用到机器学习)
十、知识点集锦
nameNode元数据:
角色在集群中都是由进程来表现的(一个节点由多个进程)。因为在node01节点上启动了nameNode进程,所以称node01为nameNode。
Client:
将数据切割成n个block块(默认block块大小:128M)。
以读取字节的方式在客户端读取该大文件。读到128M时,形成一个Block块,向nameNode进行汇报。(block的数量=大文件的大小/128M)
为什么要使用管道传输?为什么要将block切割成一个个的packet?
并行存储
处于安全fsimage已经加载到内存中,可以查看到文件目录,但是无法读取。
HDFS集群不允许修改,文件一旦上传成功就不能修改block块大小。禁掉是为了防止集群泛滥。
十一、搭建集群
角色=进程
模式:
1、伪分布式
在一台服务器上,启动多个进程,分别表示各个角色
2、完全分布式
在多台服务器上,每台服务器启动不同角色的进程,使用多台服务器组成HDFS集群
Node01:namenode
Node02:secondarynamenode datanode
Node03:datanode
Node04:datanode
3、高可用的安全分布式
Node01:namenode
Node02:secondarynamenode datanode
Node03:datanode namenode
Node04:datanode