简介
HDFS 分布式文件系统,通过网络实现文件在多个计算机上进行分布式存储,具有处理超大数据集、流式处理、可以运行在廉价服务器等优点。
与传统文件系统相比
- 文件存储在多个计算机服务器,构成集群网络
- 计算机集群由廉价硬件构成
- 数据容错高,多副本存储
分布式文件系统结构
分布式文件系统采用“CS”架构,客户端通过RPC协议连接服务器,请求文件访问,客户端与服务器可以根据权限限制底层数据的访问。文件系统将文件分为多个“块”,每个块的大小可以自定义,在2.0版本中默认大小为128MB。
在物理结构上由计算机集群的多个节点构成,分为“主节点”又称“名称节点”,以及“子节点”又称“数据节点”。
- 名称节点 -----负责文件和目录创建、删除、重命名等,存储数据的元信息,管理数据节点和数据块的映射关系,客户端访问名称节点,获得文件的存储信息,如存储节点、块数量、块大小等,客户端根据这些信息直接访问数据节点获取数据
- 数据节点 -----负责存储数据,根据名称节点的命令创建、删除数据和冗余数据,定时向名称节点汇报当前文件块信息
相关概念
块
hadoop2.0 默认块大小128MB,在HDFS中文件会被拆分成多个块,每个块作为独立的数据单元存储。为了降低单点故障的风险,每个块文件会形成副本数据存储在另外的数据节点。
优点
- 支持大文件存储。大文件被分割分散存储。
- 简化系统设计。块大小固定,方便元数据管理。
- 适合数据备份。每个块数据都有固定数量的副本。
名称节点与数据节点
NameNode负责管理HDFS的命名空间,存在两个核心文件,FsImage和EditLog。FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据信息。EditLog用于记录客户端上传、删除、重命名等操作。
名称节点在启动时,(系统处于“安全模式”,客户端只能对文件读取操作)加载FsImage内容到内存中,然后执行EditLog中的操作,更新最新的文件树到内存,最后创建一个新的FsImage和一个空的EditLog(启动成功退出“安全模式”)。
在系统运行过程中,对文件的操作记录在EditLog中而不是直接写进FsImage,FsImage一般都比较大,如果频繁的操作FsImage文件会对系统带来负担。在EditLog文件到达一定大小或者系统运行的固定间隔时间,就会执行一次“合并”。
数据节点负责数据存储和读取,根据客户端或者名称节点的调度来进行数据的存储和检索,定时向名称节点发送自己所存储的块列表,如果名称节点在固定间隔没有收到数据节点的心跳,就会认为该数据节点故障,不会再发送数据请求,并根据旧的数据块信息,在其他数据节点生成其他数据副本。
第二名称节点
主要起到两个作用
- 解决EditLog逐渐变大的问题
- 设置名称节点的元数据“检查点”
系统运行中EditLog文件不断的增大,如果不进行处理,在启动名称节点加载FsImage执行EditLog操作时整个系统处于“安全模式”的时间就会变长,无法对外提供写操作。
EditLog和FsImage的合并操作
- 第二名称节点经过时间间隔与名称节点通信,请求停止使用EditLog文件,并把名称节点的Editlog和FsImage拉回本地,将FsImage加载如内存,执行Editlog操作。
- 名称节点收到停用EditLog请求,创建EditLog.new文件,后续客户端操作记录在新文件。
- 合并结束。第二名称节点将FsImage发送回名称节点,并用Editlog.new替换EditLog。
名称节点的检查点
通过上面的合并过程可以知道,第二名称节点周期性的获得名称节点的元数据信息,具备一点的数据备份能力,但是如果在合并过程中名称发生了错误,还是会造成中间的一些数据丢失。在HDFS的设计中并不支持直接切换第二名称节点,因此次处只能作为“检查点”。
为了解决这种单点故障信息丢失,可以使用HA高可用模式,下一遍阐述什么是高可用。
HDFS存储原理
数据冗余存储、数据存储策略、数据错误与恢复。
数据冗余存储
在分布式文件系统中,为了提高系统的容错性和可用性,将文件做冗余处理,即文件分割成块后,每个块作为独立的存储单元形成副本存储,副本数量可配置。
名称节点记录这些块与数据节点的映射关系,数据节点存储这些块数据。
- 加快数据传输速率。当多个客户同意发起访问请求时,可以从多个节点同时获取数据。
- 容易检查数据错误。每个块数据都有副本数据,通过网络传输容易判断数据是否完整一致
- 保证数据的可靠性。及时某些数据节点故障,名称节点会安排其他数据节点生成该故障节点的数据块。
数据存储策略
数据存储包括数据存放、数据读取和数据复制等方面。
1、数据存放。
HDFS集群一般采用机架的存放策略。机架与机架间经过路由或交换机,同一机架内的机器通信则不用经过交换机。HDFS默认冗余因子为3,即除了文件本身还有两个复制的副本文件。
- 如果是集群内的机器发起数据存储,则第一个副本文件就存放在当前数据节点。如果是集群外的机器发起请求,则在集群内部挑选一台磁盘不太满,cpu不太忙的数据节点
- 第二个副本文件存放在与第一副本不同机架的数据节点
- 第三个副本文件存放在以第一副本相同机架的其他数据节点
- 如果还有更多的副本,则继续从集群中挑选数据节点存储。
2、数据读取
客户端访问名称节点获得数据块不同副本的存放位置列表,列表包含了副本所在的数据节点,调用API确定客户端与这些数据节点所在的机架ID,优先读取相同机架的数据副本,如果没有就随机选择一个副本数据
3、数据复制
HDFS在对数据写入时,采用了流水线复制的策略,大大提高数据复制过程的效率。
- 文件按块大小被切分成多个块,每个块向名称节点发起写入请求
- 名称节点根据集群内数据节点的使用情况,返回一个数据节点列表给客户端
- 客户端根据列表名单。首先将数据写入第一个数据节点,并同时将列表传给第一个数据节点
- 当第一个数据节点接收到4kb数据时,写入本地,并且想列表中的第二个数据节点发起连接请求,将自己接收到的数据和列表传递第二个数据节点
- 重复上一步,形成一条数据复制的流水线,数据全部写入时,副本的复制也完成了。
- 注意:列表中的数据节点有一个算一个,数据节点故障传输不会结束,最后名称节点检测到数据副本少于约定的冗余因子,会自动安排其他数据节点完成复制。
数据错误与恢复
数据错误主要体现在三个方面:名称节点出错、数据节点出错、数据错误。
1、名称节点错误
名称节点维护这整个分布式系统最核心的FsImage和EditLog,如果名称节点出错了没有备份机制,那么整个集群就宕机了。
2、数据节点错误
数据节点会以心跳方式定时向名称节点上报自己的数据信息,如果在固定的时间内名称节点没有收到心跳包,该数据节点就会被标记为宕机,名称节点不会再向该数据节点发送任何I/O请求。一旦名称节点发现系统内的文件副本少于冗余因子,会调用其他数据节点生成新的副本,一旦原有的数据节点恢复,就会删除一份冗余数据。
3、数据出错
在网络传输、磁盘等都有可能造成数据错误,客户端在收到数据后会采用MD5和shal对数据块进行校验,以确认正确性。在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息文件写入同一个路径的隐藏文件里面。的那个客户端读取文件时,会先读取该信息,然后利用这个对每个读取的数据校验,如果检验错误,客户端会向其他节点请求数据,并把该错误报告给名称节点,名称节点会定时检查并且复制这个块