• 整体上说
  • HDFS框架结构一
  • HDFS框架结构二(HDFS High Availability)

整体上说

HDFS 采用 Master/Slave 架构。一个 HDFS 集群是由一个 NameNode 和一定数目的 DataNodes组成。其中 NameNode 是一个中心服务器,负责文件系统的名字空间(namespace) 管理以及客户端对文件的访问。集群中的 DataNode 一般是一个节点一个,负责管理它所在节点上的存储。

  • 从内部看,一个文件其实被分成一个或多个数据块,这些块存储在多个 DataNode 之上。
  • NameNode 执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,同时它也负责确定数据块到具体 DataNode节点的映射。
  • DataNode 负责处理文件系统客户端的读写请求,在 NameNode 的统一调度下进行数据块的创建、删除和复制。

HDFS使用Java语言开发,因此任何支持Java的机器都可以部署NameNode或DataNode。由于采用了可移植性极强的 Java 语言,这就使得 HDFS 可以部署到几乎所有类型的机器上。


HDFS框架结构一

整个结构是一个主从结构。即在集群中一个主机器对应多个从属机器

  • NameNode是 HDFS 的元数据节点,负责管理文件系统的名字空间以及和客户端进行交互。

    • 数据块和副本存放在哪些 DataNode 上是由NameNode 决定的,读取文件时 NameNode 会尽量让用户先读取最近的副本,以降低带宽消耗和读取时延
    • NameNode 全权管理数据块的复制,它周期性地从集群中的每个 DataNode 接收心跳信号和块状态报告。接收到心跳信号意味着该 DataNode 节点工作正常。块状态报告包含了一个该 DataNode上所有数据块信息的列表。
    • 作为master的NameNode负责管理分布式文件系统的命名空间(NameSpace),即维护的是文件系统树及树内的文件和目录。这些信息以 两个核心文件(fsImage和editlog)的形式持久化本地磁盘中。不同的是,namenode也记录了每个文件的各个块所在的datanode的位置信息,但并不持久化存储这些信息,而是在系统每次启动时扫描所datanode重构得到这些信息,也就是说保存在运行内存中。
    • Checkpoint:当NameNode 启动时,它从硬盘中读取 Edit log 和 FsImage, 并将所有 Edit log 中的事务应用在内存中的 FsImage 上,并将这个新版本的 FsImage 从内存中保存到本地磁盘上,然后删除旧的 Editlog, 因为这个旧 Edit log 中的事务都已应用在 FsImage 上。以上这个过程称为一个检查 点(checkpoint)。
    • HDFS中的更新操作都被写到EditLog,而不是直接写入FsImage,这是因为对于分布式文件系统而言,FsImage文件通常都很庞大,如果所有的更新操作都直接往FsImage文件中添加,那么系统就会变得非常缓慢。相对而言,EditLog通常都要远远小于FsImage,更新操作写入到EditLog是非常高效的。名称节点在启动的过程中处于“安全模式”,只能对外提供读操作,无法提供写操作。在启动结束后,系统就会退出安全模式,进入正常运行状态,对外提供写操作
  • Secondary NameNode:是NameNode的助手,辅助NameNode合并fsimage和EditsLog。

    • 在Namenode运行期间,HDFS会不断发生更新操作,这些更新操作不会直接写到fsimage文件中,而是直接被写入到editlog文件的,文件会越来越大。当Namenode重启时,会加载fsimage加载到内存中,并且逐条执行editlog中的记录,editlog文件大,就会导致整个过程变得非常缓慢,使得Namenode在启动过程中长期处于“安全模式”,无法正常对外提供写操作,影响了用户的使用。

      HDFS采用了SecondaryNameNode这个守护线程,可以定期完成editlog与fsImage的合并操作,减小editlog文件大小,缩短Namenode重启时间;也可以作为Namenode的一个“检查点”,将保存Namenode内存中的元数据信息,保存在fsimage镜像文件中。

    • 但是当NameNode 宕掉后,Secondary NameNode并不会成为新的NameNode。所以在这个架构中,NameNode 是单点故障

    • Secondary NameNode 的处理流程如下:

      • NameNode 响应 Secondary NameNode 的请求,将 edits log 推送给 Secondary NameNode, 并开始重新写一个新的 edits log
      • Secondary NameNode 收到来自 NameNode 的 fsimage 文件和 edits log
      • Secondary NameNode 将 fsimage 加载到内存,应用 edits log, 并生成一个新的fsimage 文件
      • Secondary NameNode 将新的 fsimage 推送给 NameNode
      • NameNode 用新的 fsimage 取代旧的 fsimage, 同 时 在 fstime 文件中记下checkpoint 发生的时间点
  • DataNode 是 HDFS 文件系统的工作节点,DataNode 会按照客户端或者是 NameNode 的调度来存储和检索数据,并定期向 NameNode 发送它所存储的数据块列表。

    • DataNode 是文件系统中真正存储数据的地方,一个数据块在 DataNode 磁盘存储时,会存储数据块本身,以及元数据包括数据块的长度、块数据的校验和、以及时间戳。
  • Heartbeats心跳用来监控集群中的各个机器。

    • 当DataNode启动后,它会向NameNode注册自己。这个注册的过程是告知NameNode有一个新的DataNode可用,并准备好存储数据块。
    • 注册成功后,DataNode会定期发送心跳给NameNode,通知NameNode它仍然是活跃的。NameNode在收到DataNode的心跳后,可以返回一些指令给DataNode。例如,NameNode可能会指示DataNode复制某个数据块到另一台机器,或者删除某个数据块。
    • 如果NameNode在超过10分钟的时间内没有收到某个DataNode的心跳,它会认为该DataNode不可用。这个时间阈值可以根据具体的配置来调整,但10分钟是一个常见的默认值.

HDFS框架结构二(HDFS High Availability)

Hadoop2.0引入了主备Standby NameNode。在 Hadoop2.0 之前,每个集群只能有一个 NameNode,它是单点故障,如果它出现问题就会导致整个集群瘫痪。因此 NameNode 需要有一定的冗余,通常的做法是把 NameNode 配置成 Active/Standby, 在 Active 失效的时候能立即无缝切换至 Standby 机上。

现阶段 Active/Standby 直接的同步有两种方式:

  • JournalNodes(JNs)伺服方式:ActiveNode 持续地将 EditsLog 写入到 JournalNode 伺服进程,而 StandbyNode 则能够实时监视并从中读取相关内容进行同步。JournalNodes 只允许一个 NameNode 进行写入操作,如果 Active 失效,Standby 将自动获得写入权。

  • Shared NFS Directory 方式:通过挂接一个主从 NameNode 节点都拥有读写权限的共享文件夹的方式进行同步。Active 一方不断将 EditsLog 写入该文件夹,而 Standby 则监视该文件的同时同步到自己的 Namesapce 中。