本章之后,将对hadoop生态系统各个服务组件进行整理介绍和分析应用。

下面先对hadoop的基础hdfs文件系统进行介绍。

一、HDFS简介

hadoop的分布式文件系统,提供海量数据存储和访问。它与现有的分布式文件系统有很多相似地方,也有很多不同与其他分布式文件系统的有价值的地方。它能够提供高容错机制,能够运行在廉价计算机硬件上。它能为应用数据访问提供高吞吐量,非常适合拥有庞大数据集的应用。HDFS放宽了一些POSIX要求,使其能够以流式方式访问文件系统数据。HDFS最开始作为Apache Nutch项目的基础设施。现在是Apache hadoop的核心项目的一部分。

高容错性是HDFS设计的核心。HDFS强调的是高吞吐量而非低延迟。HDFS文件是“一次写入多次读取”访问方式,只能够在文件末尾追加,不能够在任意位置修改文件。HDFS为应用提供了接口来迁移应用自身到数据所在地附近。

HDFS特点:

  1. 超大存储。能存储数以百万计的文件,每个文件大小可以超过10GB,总存储量达10PB级。
  2. 低廉。使用廉价的商业服务器实现大规模存储。通过应用级数据复制实现高可用性及高吞吐量。
  3. 批处理。更擅长流式读写大文件,而不擅长低延迟访问大量小文件。更注重批处理,而非交互响应的时间。
  4. 优雅的处理机器和磁盘故障。
  5. 支持MapReduce处理。

二、NameNode和DataNode

HDFS是Master/Slave结构。

NameNode(简称NN)是HDFS的管理者,它管理HDFS文件系统的命名空间,以及控制客户端访问文件。DataNode(简称DN)是管理该节点的数据存储。一个HDFS文件会被划分为多个block,分别存储到多个DN节点上。NN执行对文件系统名字空间的操作,并管理着文件的blocks到DNs的映射。DN响应来至客户端的读写请求。DN执行block的创建、删除,以及来至NN的复制指令。

HDFS文件系统结构如下图:

HDFS Federation方案 hdfs技术_客户端

NameNode作用:

  1. 保存系统名字空间的元数据信息,这些信息保存在fsimage(文件系统镜像文件)、edit(编辑日志文件)。
  2. 接收DN心跳。
  3. 接收DN上报block位置信息,NN不会永久保存block的位置信息,每次系统启动时DN都会上报这些信息给NN。
  4. HDFS目录配额。
  5. 文件访问权限控制。
  6. 保存文件复制因子。控制DN复制block副本。
  7. 响应客户端请求。
  8. 验证客户端身份。

在系统启动时,NN会进入安全模式,该模式下不会进行数据块的复制。NN会接收DN心跳及上报的block位置信息。如果一个block的副本数达到了NN记录的最小副本数,则认为该block是安全的,当安全的block占所有block的百分比达到NN记录的安全百分比时,且安全的DN数达到配置的值时,NN会继续等待一小段时间默认是30s才会退出安全模式。然后NN会针对那些没有达到最小副本数的block,将其复制到其它DN上。如果NN无法退出安全模式,就需要使用hdfs fsck命令检查哪些block有问题,然后将有问题的文件删除,才能解决启动时无法退出安全模式的问题。

安全模式相关一些配置:

  1. dfs.namenode.replication.min,安全block要求的最小副本数。
  2. dfs.namenode.safemode.threshold-pct,安全的block占总block数的百分比,默认0.999f。如果达到1则永远退不出安全模式;如果配置小于0,则表示不等待任何block达到安全要求。
  3. dfs.namenode.safemode.min.datanodes,离开安全模式时最小可用的DN数,默认是0。
  4. dfs.namenode.safemode.extension,单位是毫秒,表示当其他安全条件满足时,再过一段时间依然满足安全条件时,才退出安全模式。

NN所在主机如果损毁,整个HDFS文件系统将会损坏,且无法利用DN上的block进行重建。因此,HDFS提供了NN的容灾机制:

 第一种是备份NN上的文件系统的元数据持久文件。通常做法是NN在写元数据文件时,同时写入一个挂载的远程文件系统 (NFS)。

 第二种做法是部署SecondNameNode(简称SNN)。SNN的作用是,同步NN的fsimage及edit log文件,定期进行edit 日志文件合并工作,生成新的fsimage文件,并将新的fsimage文件同步给NN。在NN损毁的情况下,可以使用SNN进行 恢复,但是由于SNN的状态始终晚于NN,故通过SNN恢复的文件难免会有部分数据丢失的情况。这种情况一般会用NFS上 的元数据文件复制到SNN上,将SNN作为新的NN。

DataNode的作用:

  1. 存储block数据。
  2. 向NN发送心跳,报告自身状态。
  3. 向NN发送block报告。
  4. 与客户端交互,传递block数据或写block。

客户端读HDFS文件流程概况:

  1. 客户端连接NN,告诉NN需要读哪个文件。
  2. NN验证客户端身份。
  3. 返回文件一个block的ID,以及该block所在的所有DN的列表,并将这些DN按与客户端的距离进行排序。
  4. 客户端选择最合适的DN读取block数据。
  5. 重复进行上面操作过程,直到所有block数据读取完毕,或者是客户端中断读取流。

客户端写HDFS文件流程概况:


  1. 客户端连NN,告知需要写文件。
  2. NN验证客户端身份及权限。
  3. NN创建文件元数据。
  4. NN响应客户端,告诉客户端可以开始写文件。
  5. 客户端将待上传的文件划分多个packet(按block大小划分),并将这些packet放在内存队列中。
  6. 客户端另起线程从内存队列中获取一个packet,向NN要待写入block的DN列表。
  7. NN根据复制因子数选择一组DN给客户端。
  8. 客户端选择列表中第一个DN连接。
  9. 第一个DN接收客户端连接,连接列表中第二个DN,第二个DN连接第三个DN,依次类推,直到最后一个DN。
  10. 客户端将packet传递个第一个DN。
  11. 第一个DN将packet写进本地磁盘,然后将其传递给第二个DN,依次下去直到最后一个DN。
  12. 最后一个DN写操作完成,返回给上一个DN写成功响应,依次向上反馈,直到第一个DN反馈给客户端写成功。
  13. 客户端重复进行6-12过程,直到队列中所有packet都写完成。当所有的packet的反馈消息都是成功的,则客户端断开流,并告知NN写文件完成。

客户端在写文件过程中,如果复制管道中任何一个DN写失败,则这个管道的写操作都会按失败处理,以及写完成的block作废,最终被回收。写失败的packet被重新返回内存队列中。


三、SecondNameNode

NN将HDFS文件系统的元数据保存在本地文件系统的磁盘上,这些元数据在不同的文件上,其中最为重要的是fsimage和edits文件。文件系统的名字空间,包括块到文件的映射、及文件系统的属性等,均被记录在fsimage文件里。对于文件的操作,比如创建文件,修改本分因子等操作均会被记录在edits文件里。

NN会在内存中保存一份整个HDFS文件系统的名字空间及块的映射。

当NN启动,或checkpoint触发时,NN就会从本地磁盘读取fsimage及edits文件,将edits记录的所有事物作用于内存中的fsimage镜像,并生成新版本的fsimage文件保存在本地磁盘。然后NN会截断edits文件。这个过程就是checkpoint。触发checkpoint过程,可以通过配置dfs.namenode.checkpoint.period参数,单位是秒,表示checkpoint周期间隔时间。还可以通过配置dfs.namenode.checkpoint.txns参数,表示当文件系统的事务堆积到一定数量后就触发checkpoint。

通常由于checkpoint过程消耗主机资源,为了减轻NN的压力,SNN(Secondary NameNode)就出现了。SNN作用就是代替NN执行checkpoint过程。通常SNN与NN在不同的主机上,内存配置与NN相同。SNN与NN之间的交互过程:

  1. SNN通知NN滚动edits文件,生成edits.new文件。
  2. SNN从NN拷贝fsimage及edits文件到本地checkpoint目录。
  3. SNN加载fsimage到内存,并将edits作用于内存的fsimage,生成新的fsimage。
  4. SNN将新的fsimage文件压缩到磁盘。
  5. SNN将新的fsimage文件传递给NN,NN采用最新的fsimage。
  6. NN将edits.new更名为edits。

由上面过程可以看出,SNN在进行checkpoint过程时,NN会将这段期间的文件变更操作写进edits.new文件里,在SNN返回新的fsimage文件后,NN将其更名为edits。这样的话SNN的checkpoint总是会比NN要少一部分文件的变更,因此当NN损毁后,使用SNN恢复的文件系统将会缺少部分数据,这是不可避免的。

四、Checkpoint Node

由于SNN的名字容易让人产生误会,故而HDS又提供了CN(checkpoint node)。CN的作用是替代SNN进行NN的checkpoint过程。它所需要的配置与SNN一样,同样启动在与NN不同的主机上。它的启动命令是hdfs namenode -checkpoint。CN可以启动多个。

五、Backup Node

BN同样有checkpoint能力。但同时它的内存中维持着与NN保持同步的文件系统的名字空间,是NN名字空间的一个备份。由于它始终与NN保持同步,因此它在checkpoint过程中不需要再特别从NN上下载fsimage及edits文件。由于BN在checkpoint时只需要将自己内存的名字空间状态写进本地磁盘并重置edits文件,因此BN将会比SNN及CN更加高效。

BN的内存要求与NN一致。目前一个NN只能支持一个BN,且使用BN后就不能使用CN。以后可能会同时支持多个BN。

BN的启动命令hdfs namenode -backup。

BN也提供了自己的web配置参数dfs.namenode.backup.address及dfs.namenode.backup.http-address。

使用BN可以让NN不需要持久存储,需要在NN配置参数dfs.namenode.edits.dir,在NN启动时使用-importCheckpoint命令就可以。

当NN损坏时,BN就可以当做新的NN使用。

六、Import checkpoint

SNN与CN都会将最后的checkpoint存储在指定的目录里,其目录结构与NN目录结构相同。配置参数dfs.namenode.checkpoint.dir。当NN启动时指定-importCheckpoint参数,则会从dfs.namenode.checkpoint.dir目录里将文件拷贝到dfs.namenode.name.dir文件目录里。如果dfs.namenode.name.dir里已存在合法的fsimage文件,则导入操作就会报失败。