hadoop技术探索之二
本章之后,将对hadoop生态系统各个服务组件进行整理介绍和分析应用。
下面先对hadoop的基础hdfs文件系统进行介绍。
一、HDFS简介
hadoop的分布式文件系统,提供海量数据存储和访问。它与现有的分布式文件系统有很多相似地方,也有很多不同与其他分布式文件系统的有价值的地方。它能够提供高容错机制,能够运行在廉价计算机硬件上。它能为应用数据访问提供高吞吐量,非常适合拥有庞大数据集的应用。HDFS放宽了一些POSIX要求,使其能够以流式方式访问文件系统数据。HDFS最开始作为Apache Nutch项目的基础设施。现在是Apache hadoop的核心项目的一部分。
高容错性是HDFS设计的核心。HDFS强调的是高吞吐量而非低延迟。HDFS文件是“一次写入多次读取”访问方式,只能够在文件末尾追加,不能够在任意位置修改文件。HDFS为应用提供了接口来迁移应用自身到数据所在地附近。
HDFS特点:
- 超大存储。能存储数以百万计的文件,每个文件大小可以超过10GB,总存储量达10PB级。
- 低廉。使用廉价的商业服务器实现大规模存储。通过应用级数据复制实现高可用性及高吞吐量。
- 批处理。更擅长流式读写大文件,而不擅长低延迟访问大量小文件。更注重批处理,而非交互响应的时间。
- 优雅的处理机器和磁盘故障。
- 支持MapReduce处理。
二、NameNode和DataNode
HDFS是Master/Slave结构。
NameNode(简称NN)是HDFS的管理者,它管理HDFS文件系统的命名空间,以及控制客户端访问文件。DataNode(简称DN)是管理该节点的数据存储。一个HDFS文件会被划分为多个block,分别存储到多个DN节点上。NN执行对文件系统名字空间的操作,并管理着文件的blocks到DNs的映射。DN响应来至客户端的读写请求。DN执行block的创建、删除,以及来至NN的复制指令。
HDFS文件系统结构如下图:
NameNode作用:
- 保存系统名字空间的元数据信息,这些信息保存在fsimage(文件系统镜像文件)、edit(编辑日志文件)。
- 接收DN心跳。
- 接收DN上报block位置信息,NN不会永久保存block的位置信息,每次系统启动时DN都会上报这些信息给NN。
- HDFS目录配额。
- 文件访问权限控制。
- 保存文件复制因子。控制DN复制block副本。
- 响应客户端请求。
- 验证客户端身份。
在系统启动时,NN会进入安全模式,该模式下不会进行数据块的复制。NN会接收DN心跳及上报的block位置信息。如果一个block的副本数达到了NN记录的最小副本数,则认为该block是安全的,当安全的block占所有block的百分比达到NN记录的安全百分比时,且安全的DN数达到配置的值时,NN会继续等待一小段时间默认是30s才会退出安全模式。然后NN会针对那些没有达到最小副本数的block,将其复制到其它DN上。如果NN无法退出安全模式,就需要使用hdfs fsck命令检查哪些block有问题,然后将有问题的文件删除,才能解决启动时无法退出安全模式的问题。
安全模式相关一些配置:
- dfs.namenode.replication.min,安全block要求的最小副本数。
- dfs.namenode.safemode.threshold-pct,安全的block占总block数的百分比,默认0.999f。如果达到1则永远退不出安全模式;如果配置小于0,则表示不等待任何block达到安全要求。
- dfs.namenode.safemode.min.datanodes,离开安全模式时最小可用的DN数,默认是0。
- 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的作用:
- 存储block数据。
- 向NN发送心跳,报告自身状态。
- 向NN发送block报告。
- 与客户端交互,传递block数据或写block。
客户端读HDFS文件流程概况:
- 客户端连接NN,告诉NN需要读哪个文件。
- NN验证客户端身份。
- 返回文件一个block的ID,以及该block所在的所有DN的列表,并将这些DN按与客户端的距离进行排序。
- 客户端选择最合适的DN读取block数据。
- 重复进行上面操作过程,直到所有block数据读取完毕,或者是客户端中断读取流。
- 客户端连NN,告知需要写文件。
- NN验证客户端身份及权限。
- NN创建文件元数据。
- NN响应客户端,告诉客户端可以开始写文件。
- 客户端将待上传的文件划分多个packet(按block大小划分),并将这些packet放在内存队列中。
- 客户端另起线程从内存队列中获取一个packet,向NN要待写入block的DN列表。
- NN根据复制因子数选择一组DN给客户端。
- 客户端选择列表中第一个DN连接。
- 第一个DN接收客户端连接,连接列表中第二个DN,第二个DN连接第三个DN,依次类推,直到最后一个DN。
- 客户端将packet传递个第一个DN。
- 第一个DN将packet写进本地磁盘,然后将其传递给第二个DN,依次下去直到最后一个DN。
- 最后一个DN写操作完成,返回给上一个DN写成功响应,依次向上反馈,直到第一个DN反馈给客户端写成功。
- 客户端重复进行6-12过程,直到队列中所有packet都写完成。当所有的packet的反馈消息都是成功的,则客户端断开流,并告知NN写文件完成。
三、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之间的交互过程:
- SNN通知NN滚动edits文件,生成edits.new文件。
- SNN从NN拷贝fsimage及edits文件到本地checkpoint目录。
- SNN加载fsimage到内存,并将edits作用于内存的fsimage,生成新的fsimage。
- SNN将新的fsimage文件压缩到磁盘。
- SNN将新的fsimage文件传递给NN,NN采用最新的fsimage。
- 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文件,则导入操作就会报失败。