分布式文件系统结构
分布式文件系统是一种通过网络实现文件在多台主机上进行分布式存储的文件系统,采用C/S模式实现文件系统数据访问,目前广泛应用的分布式文件系统主要包括GFS和HDFS,后者是前者的开源实现。
分布式文件系统在物理结构上由计算机集群中的多个节点构成,这些节点分为两类:主节点(亦称“名称节点”) 、 从节点(亦称“数据节点”)
名称节点,负责文件和目录的创建、删除和重命名等,同时管理着数据节点和文件块的映射关系,客户端通过访问名称节点找到请求文件的存储位置,进而到相应位置读取所需文件块。
数据节点,负责数据的存储、读取,存储时,由名称节点分配存储位置,由客户端直接写入相应数据节点;读取时,客户端从名称节点获取数据节点和文件块的映射关系,从而到相应位置访问数据块;数据节点还要根据名称节点的命令创建、删除数据块和冗余复制。
HDFS相关概念
块:
HDFS将文件划分为若干块,中以块为单位完成数据读写,提高读写效率,一般64M,可设定。64M比一般文件系统要大,是为了减少寻址开销,寻址开销包括 磁盘寻道开销 + 数据块定位开销。块过小,导致定位开销增大;块过大,由于MapReduce中Map一次仅处理一块,如果启动的任务过少,会降低并行效率。
名称节点:
作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问,不参与数据的传输。保存2个核心数据结构,FsImage + EditLog。其中FsImage维护文件系统树 以及 所有文件和文件夹的元数据;EditLog存储所有针对文件的的操作历史,如创建、删除、重命名等操作。
<注>1.名称节点数据保存在内存中。NameNode记录但非持久化存储文件中块所在数据节点信息,而是在系统每次启动的时候扫描所有数据节点,重构得到元数据。
2.HDFS的文件更新操作写入EditLog而非FsImage,因为FsImage文件较大,修改效率低。
3.NameNode启动时,将FsImage内容加载到内存,执行EditLog中操作(以保证内存中元数据最新),之后创建新的FsImage和空的EditLog。
数据节点:
是HDFS的工作节点,负责数据的存储和读取,受Client和名称节点调度,定期向名称节点发送自己存储的块列表。数据节点的数据实际保存在本地Linux文件系统中,一般一个节点运行一个数据节点进程,负责处理客户端的读写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作。每个数据节点周期性地向名称节点发送“心跳”信息,报告自己的状态,没有按时发送心跳包的数据节点会被标记为“宕机”。
当客户端访问文件时,首先把文件名发送到名称节点,名称节点找到对应的数据块;再根据数据块信息找到实际存储该块的数据节点的位置,并把该位置发送给客户端;最后客户端直接访问数据节点获取数据。名称节点不参与数据的传输,使得一个文件的数据能够在不同的数据节点上实现并发访问,提高数据的访问速度。
第二名称节点:
当数据操作记录较多的时候,EditLog也会越来越大,为了解决这一问题,增加了第二名称节点,主要两个功能,1)完成EditLog和FsImage的合并,减小EditLog大小,缩短NameNode重启时间;2)作为NameNode的检查节点,保存NameNode中的元数据信息。
(补充第二名称节点的工作原理)
HDFS体系结构
HDFS是Hadoop的文件系统,是Hadoop的一个核心组成部分,具有超大数据、流式处理、可以运行在廉价商用服务器上等优点。HDFS采用主从(Master/Slave)结构模型,系统集群包括一个名称节点和若干数据节点。
HDFS的命名空间包括目录、文件和块,支持对HDFS中的目录、文件和块做创建、删除、修改等基本操作。但是不支持磁盘配额、权限管理、软硬连接等。
数据在HDFS节点之间的传输采用的通信协议建立在TCP/IP协议基础之上,通信实体包括客户端与名称节点、名称节点与数据节点,客户端与数据节点。其中,客户端向名称节点发起TCP连接,并使用客户端协议与名称节点进行交互;名称节点与数据节点之间通过数据节点协议进行交互;客户端与数据节点通过RPC实现,名称节点不会主动发起RPC,仅相应客户端和数据节点的RPC请求。
HDFS存储原理
HDFS作为一个文件系统,主要的作用就是对数据进行存储,在这个过程中需要考虑数据怎么存、怎么读、怎么进行冗余备份,同时,还要考虑一旦出现故障了要该怎么恢复。所以,HDFS的存储原理主要讨论数据的冗余存储、存取策略、数据错误与恢复
<1>数据的冗余存储
数据的冗余存储是为了实现文件系统的容错性和可用性,HDFS采用多副本方式对数据进行冗余存储,一个数据块的多个副本会被分布到不同的数据节点上。这样做的优点:
- 加快数据的传输速度,多客户端同时访问时,允许不同客户端仓不同数据块副本中读取数据;
- 便于检查数据错误,数据节点中间通过网络传输数据,多副本存储方式便于数据校验,检查数据传输是否出错;
- 保证数据可靠性
<2>数据存取策略
存取策略包括数据存放、数据读取和数据复制。
1)数据存放
HDFS的默认冗余因子是3,一个文件块被存储到3个地方,其中两份副本在同一机架的不同机器上(通常一个机器上仅一个数据节点),第三份副本存放在另一机架的机器上。一般情况下副本放置策略:
- 如果是集群内发起的写操作请求,第一个副本放置到发起请求的节点上,实现就近写入;如果集群外部写请求,从集群内部挑选空闲节点存储第一副本
- 第二副本放置在与第一副本不同机架的数据节点上
- 第三副本放置到与第一副本相同的机架上
- 如有更多副本,从集群中随机选择节点存放。
2)数据读取
客户端读取数据时,从名称节点获得不同副本的存放位置列表(包含副本所在的数据节点),通过HDFS提供的接口确定客户端和数据节点所属机架ID,优先从与客户端处于同一机架的副本数据节点读取数据。如无,则随机选择节点进行读取。
3)数据复制
HDFS采用流水线复制策略,当客户端向HDFS中写入文件时,首先写入本地进行切分,每个块都向名称节点发起写请求,名称节点选择一个数据节点列表返回给客户端;客户端把数据写入列表中第一个数据节点,该节点收到4KB数据后写入本地,并将接收到的数据和节点列表发送给列表中第二个节点,以此类推,文件写完的时候数据复制也同时完成。
<3>数据错误与恢复
HDFS具有较高的容错性,将硬件出错视为常态,并设计了相应的错误检测机制和自动恢复机制。
1)名称节点出错
名称节点是文件系统的核心,两个核心数据结构FsImage和EditLog。Hadoop采用两种机制确保名称节点的安全:
- 把名称节点的元数据信息存储到其他文件系统(如远程挂载的网络文件系统NFS)
- 运行一个第二名称节点,名称节点宕机后利用第二名称节点进行数据恢复。(前文介绍过这种恢复可能丢失部分数据)
一般将上述方式结合使用,当名称节点发生故障时,首先从远程挂载的网络文件系统总获取备份的元数据信息,放到第二名称节点上进行恢复,并把第二名称节点用作名称节点。
2)数据节点出错
当名称节点接收不到数据节点的心跳信息时,视作该数据节点宕机,将节点标记为不可读。名称节点定期检查数据块的副本数,如果由于数据节点宕机导致某些数据块副本小于冗余因子,则启动数据的冗余复制。
3)数据出错
文件创建时客户端会对文件块进行信息摘录,客户端读取数据时利用文件信息对每个数据块进行校验,如果检验出错则从其他节点读取,并报告名称节点,名称节点定期检查并重新复制文件。