1.HDFS写文件流程
客户端向HDFS中写文件的具体流程
以300MB大小的1.txt文件为例,针对上图介绍HDFS写文件流程。
(1)客户端(Client)发起上传1.txt文件到指定目录的请求,与NameNode建立通信。
(2)NameNode检查客户端是否有上传文件的权限,以及文件是否存在。若检查通过,则通知客户端上传文件,并向其发送分块策略。
(3)客户端根据分块策略(默认以125MB为例)对文件1.txt进行切分,形成3个Block,分别是blk1、blk2和blk3。
(4)客户端向NameNode请求上传第一个Block,即blk1。
(5)NameNode根据副本机制和机架感知向客户端返回可上传blk1的DataNode列表,这里指的是Hadoop1、Hadoop2和Hadoop3。
(6)客户端从NameNode接收到blk1上传的DataNode列表之后,首先根据就近原则从DataNode列表中选择一台DataNode(如Hadoop1)并与虚拟机建立管道(Pipeline),用于传输数据,然后Hadoop1会与第二台DataNode(如Hadoop2)建立管道,最后Hadoop2会与第三台DataNode(如Hadoop3)建立管道。
(7)首先,Hadoop3向Hadoop2汇报管道建立成功;然后,Hadoop2向Hadoop1汇报管道建立成功;最后,Hadoop1向客户端汇报管道建立成功,此时客户端与所有DataNode列表中的所有DataNode都建立了管道。
(8)客户端开始传输blk1,传输过程是以流式写入的方式实现,具体过程如下。
1)将blk1写入到内存中进行缓存。
2)将blk1按照packet(默认为64KB)为单位进行划分。
3)将第一个packet通过管道发送给Hadoop1。
4)Hadoop1接收完第一个packet之后,客户端会将第二个packet发送给Hadoop1,同时Hadoop1通过Pipeline将第一个packet发送给Hadoop2。
5)Hadoop2接收完第一个packet之后,Hadoop1会将第二个packet发送给Hadoop2,同时Hadoop2通过Pipeline将第一个packet发送给Hadoop3。
6)依次类推直至blk1上传完成。
(9)首先,Hadoop3向Hadoop2发送blk1写入完成的信息;然后,Hadoop2向Hadoop1发送blk1写入完成的信息,最后,Hadoop1向客户端发送blk1写入完成的信息。
注意:客户端成功上传blk1后,重复第4~9步的流程,依次上传blk2和blk3,最终完成1.txt文件的上传。
2.HDFS读文件流程
客户端从HDFS中读文件的流程
以300MB大小的1.txt文件为例,针对上图介绍HDFS读文件流程。
(1)客户端发起读取1.txt文件的请求,与NameNode建立通信。
(2)NameNode检查客户端是否有读取文件的权限,以及文件是否存在。若通过检查,则通知客户端读取文件,并向其发送1.txt文件的Block列表,该列表中记录了每个Block及其副本所在的DataNode的地址,如Hadoop1、Hadoop2和Hadoop3的主机地址。
(3)客户端按照就近原则从NameNode返回的Block列表读取Block。 首先客户端从Block列表中选择距离自身最近的DataNode(如Hadoop1)读取Block,如果该DataNode可以读取文件的所有Block,则读取结束;如果该DataNode没有读取文件的所有Block,则客户端从Block列表中继续选择距离自生最近的DataNode读取剩余的Block,直至获取文件的所有Block才结束读取。
(4)客户端将读取所有的Block按照顺序进行合并,最终形成1.txt文件,需要注意的是,如果文件过大导致NameNode无法一次性文件的所有Block列表返回客户端时,会分批次将Block列表返回客户端。
3.HDFS的健壮性
HDFS的主要目标就是即使在出现故障的情况下也能可靠地存储数据,其运用了5种策略来保证存储数据的可靠,具体策略如下。
(1)心跳机制
- HDFS在运行期间,为了确保NameNode可以实时获取每个DataNode的健康状态,会在NameNode和每个DataNode之间建立一种心跳机制,即每个DataNode会根据固定时间间隔(默认是3s)周期性的向NameNode发送心跳信息。
- NameNode会在固定间隔时间内(默认是3s)接收到DataNode发送的心跳信息,认为该DataNode处于存活状态,反之则认为该DataNode处于假死状态。
- 在最大间隔时间(10min)内仍然没有接收到处于假死状态的DataNode发送的心跳信息,NameNode会认为该DataNode处于宕机状态。
- 当某个DataNode处于宕机状态之后,可能会造成某些Block的副本数无法达到系统要求。
- 这时,NameNode会启动复制操作,令其他处于存活状态的DataNode为这些Block创建新的副本。
(2)副本机制
- 副本机制可以确保存储在DataNode的每个Block都存在多个副本,默认的副本数为3(包含自身),即每个Block除自身外还存在2个副本。
- 若其中一台DataNode宕机导致Block的副本数不足3时,HDFS会为该Block创建新的副本,并将其存储到处于存活状态的DataNode中,以确保每个Block的副本数为3。
(3)数据完整性校验
- 客户端从某个DataNode获取的Block有可能是已损坏的,损坏的原因可能是由于DataNode的存储设备错误或者网络错误造成的。
- 针对上述问题HDFS的客户端实现了对文件内容进行校验和检查的功能;
- 当客户端从HDFS读取文件时,会计算这个文件中每个Block的校验和(Checksum),并将校验和做为一个单独的隐藏文件保存在HDFS中;
- 当客户端获取文件内容后,它会校验从DataNode获取Block的校验和,并与保存为隐藏文件的校验和进行匹配,如果不匹配,客户端可以选择从其他DataNode获取该文件的Block。
(4)安全模式
- HDFS的安全模式是一种特殊状态,该状态下对于客户端来说只能对HDFS读,不能写。
- HDFS的安全模式分为两种情况:
(1)一种情况是HDFS启动时会进入到安全模式,DataNode会向NameNode报告自身的Block状态,当Block的副本数符合HDFS规定的副本数时,该Block的数据被认为是完整的,HDFS会退出安全模式。
(2)另一种情况是HDFS中某个Block的副本丢失时,HDFS也会进入安全模式,NameNode会自动复制Block到DataNode上;当Block的副本数满足了HDFS规定的副本数时,HDFS会退出安全模式。
(5)快照
- HDFS的快照是HDFS整个文件系统或某个目录在某个时间点的镜像。
- 当用户出现错误性的操作导致HDFS中的数据缺失时,可以利用快照恢复缺失数据,使缺失数据的HDFS恢复至已知的良好时间点。