1接收客户端的请求
管理元数据(文件上传时间、文件权限、文件属主、大文件的block数及blockId号)
管理集群
持久化内存中的元数据。
因为内存不稳定,可以将数据持久化到磁盘上。
持久化的详细过程:
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信息
使用SecondaryNameNode的原因:
一旦namenode宕机,用于恢复的fsiamge数据很旧,会造成大量数据的丢失。
因为需要合并大量的edits文件生成fsimage,导致namenode重启时间过长。
若nameNode进行持久化,会造成nameNode负载太高,集群不可用。所以将持久化的工作交给SecondaryNameNode(NameNode的助理)去做。
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写数据的详细流程
1、客户端发送请求到namenode,告诉namenode上传文件的文件名、文件大小、文件拥有者。
2、namenode根据以上信息算出文件需要切成多少块block,以及block要存放在哪个datanode上,并将这些信息返回给客户端。
3、客户端首先将其中一个block写在datanode上,每一个block默认都有3个副本,并不是由客户端分别往3个datanode上写3份,而是由已经上传了block的datanode产生新的线程,由这个namenode按照放置副本规则往其它datanode写副本,这样的优势就是快。
4、写完后返回给客户端一个信息,然后客户端在将信息反馈给namenode。
5、需要注意的是上传文件的拥有者就是客户端上传文件的用户名,举个例子用windows客户端上传文件,那么这个文件的拥有者就是administrator,和linux上的系统用户名不是一样的。
1、客户端发送请求到Namenode,获得block的位置信息,因为真正的block是存在Datanode节点上的,而namenode里存放了block位置信息的元数据。
2、Namenode返回所有block的位置信息,并将这些信息返回给客户端。
3、客户端拿到block的位置信息后通过管道并行的读取block信息,block默认有3个副本,每一个block只需要从一个副本读取就可以。
4、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