HDFS原理
在HDFS中有三个模块
分别是:NameNode、SecondaryNameNode、DataNode
1.NameNode
NameNode是掌控全局的模块,主要作用有:
①.用来管理DataNode以及元数据;
- 文件的上传时间
- 文件权限
- 文件的位置信息
- block的Id
②.提供读写服务;
接收来自Client的读写请求,返回BlockId、地址等信息
③.收集DataNode汇报的block信息以及心跳信息。
NameNode保存的metedata信息包括:
文件owership和permissions
- 文件大小,时间
- block列表:blockID
- Block副本位置(由DataNode上报)
SecondrayNameNode
作用:持久化内存中的元数据,除了block的位置信息,其他元数据都会持久化
由于NameNode中产生的元数据都是在内存中,随着文件越来越大以及各种各样的原因,存放在内存中就会不稳定,我们可以使用SecondaryNameNode将元数据持久化到磁盘上来保证数据的稳定性。在持久化的信息中,没有block的位置信息,因为block的位置是有可能发送变动的,如果block位置信息发生变化,就会产生信息的不同步,降低集群的可用性。
首先,SecondaryNameNode会把NameNode中的edits和fsimage文件拉取过来,其中edits中存储的是NameNode的这个阶段的所有操作,fsimage则是空的文件,在SecondaryNameNode中,会根据edits重演NameNode的操作,并将产生的数据存放到fsimage中,最终合并到fsimage.ckpt中,然后把fsimage.ckpt推送到NameNode中。
DataNode
作用:
1.存储源数据(以block块的形式存储)
2.接收客户端的读请求
3.向NameNode发送心跳信息
写的流程
通过管道实现并行存储,同步的对block数据块进行写入与备份,写的时候把block块分成64K大小的packet通过管道开始源源不断的传输。
之所以会使用管道机制,是为了实现并行存储,这样会减少上传的时间,提高整个集群的可用性。
1. 如果要上传一个大文件,client切割大文件,计算大文件block数,大文件地址/128M=block数量
2. client对NameNode汇报:
(1)当前大数据文件的block数
(2)当前大文件属于谁 权限
(3)上传时间
for(Block block:bocks(大文件切割出来的Block)){
3. client切割出来一个block
4. client请求block块的Id号以及地址
5. 因为NameNode能够掌控全局,管理所有的DN,所以它将负载不高的DN地址返回给client
6. client拿到地址后找到DN去上传数据
7. DN将block存储完毕之后会向NameNode汇报当前的存储情况
}
读的流程
1.client访问NameNode,查询元数据信息,获得这个文件的数据块位置
2.就近挑选一台datanode服务器,请求建立输入流 。
3.DataNode向输入流中写数据
4.关闭输入流
备份机制
1.第一个block存储在负载不是很高的一台服务器上
2.第一个备份的block存储在与第一个block不同机架的随机一台服务器上
3.第二个备份在与第一个block备份相同机架的不同服务器上
注意:集群的DataNode节点要大于等于副本数+1
权限
依据Linux的用户权限系统
安全模式
1.加载fsimage到内存中
2.如果edits文件不为空,那么NameNode自己来合并
3.检查DataNode的健康情况
4.如果有DataNode死亡,指挥做备份