思维导图:


hdfs的元数据持久化的概念 hdfs元数据持久化过程_HDFS

分布式存储

一、NameNode

1接收客户端的请求

  1. 管理元数据(文件上传时间、文件权限、文件属主、大文件的block数及blockId号)
  2. 管理集群

二、SecondaryNameNode

持久化内存中的元数据。

因为内存不稳定,可以将数据持久化到磁盘上。

持久化的详细过程:

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的助理)去做。

三、DataNode

  1. 存储源数据,以block块的形式存储
  2. 接收客户端的读请求

四、写的流程

      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