3.2 HDFS 架构

任务目的

  • 理解 HDFS 存储架构
  • 熟知 HDFS 4个组成部分的主要职责

任务清单

  • 任务1:HDFS 存储架构图
  • 任务2:HDFS 组成结构

详细任务步骤

任务1:HDFS 存储架构图

  HDFS采用主从架构(Master/Slave架构),这种架构主要由四个部分组成,分别为HDFS ClientNameNodeDataNodeSecondaryNameNode

  一个HDFS集群是由一个NameNode多个DataNode组成的。其中,NameNode是HDFS集群的主节点负责管理文件系统的命名空间(namespace)以及客户端对文件的访问;DataNode是集群的从节点负责管理它所在节点上的数据存储

  HDFS中的NameNode和DataNode各司其职,共同协调完成分布式的文件存储服务。

Vditor

图1

任务2:HDFS 组成结构

2.1 Client:客户端

  在Hadoop生态各组件里,分别有其对应的Client。比如,在HDFS里,在分析其原理时,是HDFS Client。同理,在MapReduce里,是MapReduce Client。

  HDFS提供了各种各样的客户端,包括命令行接口、Java API等。Client(代表用户)通过与 NameNode和DataNode 交互访问HDFS中的文件。

  Client的主要职责有:

  (1)文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。

  (2)与 NameNode 交互,获取文件的位置信息。

  (3)与 DataNode 交互,读取或者写入数据。

  (4)Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。

  (5)Client 可以通过一些命令来访问 HDFS。

2.2 NameNode :名称节点

  NameNode就是 HDFS 的 Master 架构,是一个主管、管理者。其主要职责有:

  (1)响应客户端读/写请求;

  (2)负责HDFS文件系统的管理工作,具体包括文件Block管理名称空间(namespace)管理

  • 文件Block管理:Namenode记录着每个文件中各个块所在的数据节点DataNode的位置信息(元数据信息),从NameNode中你可以获得每个文件的每个块所在的DataNode。但是他并不持久化存储这些信息,因为这些信息NameNode会在每次启动系统时动态地重建这些信息。

    • 这些元数据信息主要为:

      “文件名 ——> 数据块” 映射
      “数据块 ——> DataNode列表” 映射
      
      • 其中,“文件名 ——> 数据块”保存在磁盘上进行持久化存储,需要注意的是NameNode上不保存“数据块——> DataNode列表”映射,该列表是通过DataNode上报给NameNode建立起来的。

      • NameNode执行文件系统的名称空间(namespace)操作,例如打开、关闭、重命名文件和目录,同时决定文件数据块到具体DataNode节点的映射。

  • 名称空间(namespace)管理:它维护着文件系统树(FileSystem Tree)以及文件树中所有的文件和文件夹的元数据(Metadata)。

  提问:那么,NameNode是如何管理分布式文件系统的命名空间呢?

  其实,在NameNode内部是以元数据的形式,维护着两个文件,分别是FsImage镜像文件EditLog操作日志文件。这些信息被Cache在RAM中,当然,这两个文件也会被持久化存储在本地硬盘。

  其中,FsImage镜像文件用于存储整个文件系统命名空间的信息EditLog操作日志文件用于持久化记录文件系统元数据发生的变化

Vditor

图2

  提问:那么,NameNode怎么把元数据保存到磁盘上的呢?

Vditor

图3

  上面这张图片展示了当NameNode启动的时候,FsImage镜像文件就会被加载到内存中,然后对内存里的数据执行记录的操作,以确保内存所保留的数据处于最新的状态,这样就加快了元数据的读取和更新操作。

  另外,在NameNode启动后,对文件系统的改动还会被持久化到EditLog中。

  只有在NameNode重启时,EditLog才会合并到FsImage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,EditLog文件会变得很大。在这种情况下就会出现下面一些问题:

  (1)EditLog文件变得越来越大,怎么去管理这个文件是一个挑战。

  (2)NameNode的重启会花费很长时间,因为有很多改动(在EditLog中)要合并到FsImage文件上。

  (3)如果NameNode宕机了,那我们就丢失了很多改动,因为此时的FsImage文件非常旧。

  因此为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小EditLog文件的大小和得到一个最新的FsImage文件,这样也会减小在NameNode上的压力。这跟Windows的恢复点是非常像的,Windows的恢复点机制允许我们对OS进行快照,这样当系统发生问题时,我们能够回滚到最新的一次恢复点上。

  现在我们明白了NameNode的功能和所面临的挑战——保持文件系统最新的元数据。

2.3 SecondaryNameNode:检查点节点

  为了解决这个问题,HDFS提供了SecondaryNameNode(检查点节点),它并不是要取代NameNode,也不是NameNode的备份,它的职责主要是:

  (1)辅助NameNode,分担其工作量;

  (2)周期性地把NameNode中的EditLog日志文件合并到FsImage镜像文件中,从而减小EditLog日志文件的大小,缩短集群启动时间,并且保证了HDFS系统的完整性。

  (3)在紧急情况下,可辅助恢复NameNode。

Vditor

图4

  上面的图片展示了SecondaryNameNode是怎么工作的?

  (1)首先,它定时到NameNode去获取EditLog日志文件,并更新到FsImage(SecondaryNameNode自己的FsImage)上。

  (2)一旦它有了新的FsImage文件,它将其拷贝回NameNode中。

  (3)NameNode在下次重启时会使用这个新的FsImage文件,从而减少重启的时间。

  SecondaryNameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它被认为是检查点节点的原因。

  现在,我们明白了SecondaryNameNode所做的不过是在文件系统中设置一个检查点来帮助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的备份。所以从现在起,让我们养成一个习惯,称呼它为检查点节点吧。

2.4 DataNode :数据节点

  DataNode就是HDFS的Slave架构,NameNode下达命令,DataNode执行实际的操作。其主要职责有:

  (1)存储整个集群所有数据块;

  一个数据块Block会在多个DataNode中进行冗余备份,而一个DataNode对于一个块最多只包含一个备份。所以可以简单地认为DataNode上存储了数据块ID和数据块内容,以及它们的映射关系。

  一个HDFS集群可能包含上千个DataNode节点,这些DataNode定时和NameNode进行通信,接受NameNode的指令,为了减轻NameNode的负担,NameNode上并不永久保存哪个DataNode上有哪些数据块的信息,而是通过DataNode启动时的上报来更新NameNode上的映射表。

  DataNode和NameNode建立连接后,就会不断地和NameNode保持联系,反馈信息中也包含了NameNode对DataNode的一些命令,如删除数据或者把数据块复制到另一个DataNode。应该注意的是:NameNode不会发起到DataNode的请求,在这个通信过程中,它们严格遵从客户端/服务器架构。

  (2)处理数据块的读/写操作。

  当然DataNode也作为服务器接受来自客户端的访问,处理数据块读/写请求。DataNode之间还会相互通信,执行数据块复制任务,同时,在客户端执行写操作的时候,DataNode之间需要相互配合,以保证写操作的一致性。

  DataNode是文件系统Worker中的节点,用来执行具体的任务:存储文件块,被客户端和NameNode调用。同时,它会通过心跳(Heartbeat)定时向NameNode发送所存储的文件块信息。

 

 

 

猜你喜欢

转载自blog.csdn.net/c_lanxiaofang/article/details/107805320
今日推荐