Hadoop HDFS 流程

一、读流程

1.客户端发起RPC读请求到NameNode

2.NameNode收到请求之后,校验这个文件是否存在,如果存在,不需要进行读权限校验,因为在hadoop的管理界面上 Permission 为: -rw-r--r--,都有读权限

而后,会将这个文件所对应的Block的存储地址放到一个队列(因为队列可以保证顺序)中返回给客户端

  例:500M的数据,会按照128M进行切分为4个block,然后每一个block有3个副本,故4x3=12个block,即:队列中有12个block的地址

3.客户端收到队列之后,会从队列中将每一个Block对应的地址来一次取出,每个Block有3个副本地址,从3个地址中取出一个较近地址来进行读取

  较近:按照机架节点位置,交换机,机房位置等

  3个:完全分布式或者默认情况下3个副本

4.当读取完一个Block之后,对这个Block进行一次checksum的验证 - 验证这个Block的数据总量是否准确;

  如果不一致,则说明该Block产生损坏,客户端会通知NameNode,然后再从其他节点的DataNode上重新读取该Block

5.如果读取完一个Block,会读取下一个Block,直到这一次的所有的Block全部读完

6.客户端在读完这一批地址会向NameNode要下一批的地址(这种情况是在:文件足够大的情况,但是出现的概率小)

7.等读完所有的block,客户端会给NameNode发送消息通知NameNode关闭文件流

读流程中,客户端通过NameNode从DataNode中获取数据的存储地址之后,再通过存储地址到DataNode上获取数据,而不是通过NameNode直接获取DataNode上的数据,这种方式的好处在于:①高并发的情况下,多线程,多个客户端从NameNode上获取数据存储的地址信息,比从通过NameNode获取DataNode上的数据信息的要小的很多,而后客户端通过获取的数据存储地址,再去DataNode上获取需要的数据;②在高吞吐(一段时间内,数据量的获取大小)需要的情况下,如果通过NameNode获取DataNode上的数据信息,瓶颈在NameNode上,而通过NameNode从DataNode中获取数据的存储地址之后,客户端再去获取DataNode上的数据,可以在一段时间内可以获取大量的数据信息

 

二、写流程:(NameNode不进行数据的存储,但是需要进行数据的管理,如数据切块的数量,切块放置的位置等)

1.客户端发起RPC写请求到NameNode,这个请求包含对文件信息的描述

2.NameNode收到请求之后,在将数据写入到DataNode之前,校验这个客户端是否有写权限,如果有权限,则检查这个路径下是否有同名文件,如果没有同名文件,则允许写入

3.NameNode计算这个文件需要的切块数量,然后会给每一个block分配对应的地址,并且将地址放入队列中返回给客户端

  例:700M大小,需要安装128M去分成7个block,并且如果按照默认情况下或者完全分布式下每个block有3个副本,故队列中有7x3=21个block地址

    同一个block的3个副本存放的地址不相同,但是不同的block的之间的副本存放的地址可能会相同

4.客户端在收到地址之后准备写入:客户端将数据进行封包(封包:packets),写入DataNode

5.在写的时候,由于每一个block有3个副本,从分配的地址中选取一个较近的节点将数据写入。在第一个副本写入之后,剩下的2个副本可以由集群内部进行备份

 写入的第一个副本所在的DataNode自动通过Pipeline(管道,实际上基于NIO的channel),将这个副本备份到其他的节点上,构成指定的副本数量,默认为3。

6.节点之间依次传递ack信息表示备份成功,在客户端收到ack信息之后,会继续写下一个block,具体过程:

第一个副本写入后,通过pipeline将第二个副本写到另一个DataNode节点上,第二个副本写入后,通过pipeline将第三个副本再写到另一个DataNode节点上,这个过程是一条链式的,当第三个副本备份完成后,返回ack信息给第二个副本,当第二个副本收到第三个副本的ack信息后,将返回第二个副本的ack信息返回到第一个副本的中,此时第一个副本节点收到第二和第三副本的ack信息,之后第一个副本的所在的节点会将所有的ack信息返回给客户端

7.客户端写完所有的block之后,会通知NameNode关闭流,此时这个文件更改为不可写

 

三、删流程

1.客户端发起RPC删除请求到NameNode

2.NameNode收到请求之后,校验这个文件是否存在,如果存在,校验这个客户端是否有删除权限,如果有权限则允许删除。

3.在通过校验之后,NameNode就会将这个操作记录到edits_inprogress文件中,然后修改内存的元数据,最后向客户端返回ack表示删除成功。此时数据并没有从hdfs上移除

4.NameNode等待DataNode的心跳,通过DataNode的心跳信息校验DataNode上是否有删除的数据,如果有要删除的数据,则NameNode会给对应的DataNode发送指令删除指定的数据,DataNode在接收到指令之后才会删除。此时数据才真正从hdfs上删除

posted @ 2020-06-22 13:41  alen-fly  阅读(204)  评论(0编辑  收藏  举报