在HDFS的读写流程中,主要是分为HDFS的读流程和写流程。其中先由HDFS写数据,之后HDFS才可以读流程。

HDFS写流程




HDFS部署服务器建议配置 hdfs客户端使用nio_hdfs


Client向NameNode发送消息,通过RPC与NameNode建立通信,其中的信息主要包括要进行写的用户,要写的文件,保存数据的地址。NameNode在接受到Client发送的消息之后,会判断该用户是否有写数据的权限,检测写的文件是否已经存在,检测要保存文件的地址是否存在。若上述的三个条件都满足,则会返回一个确定消息个Client,否则直接报错。

Clinet在接收到NameNode的确认信息之后,会按照切片规则,对文件进行切片。切片完成后,向NameNode发送消息,请求获得保存第一个block的DataNode地址。

NameNode收到Client发送的地址请求之后,根据机架感知原则和副本机制(默认3份),返回存放block的DataNode地址。

Client接收到DataNode节点A的地址之后,通过RPC与DataNode节点A建立通信,建立pipline通道,之后DataNode节点A与DataNode节点B建立通信,DataNode节点B与DataNode节点C建立通信,完成整个pipline的建立。A、B、C通讯建立完成后,从C->B->A逐级返回确认信息,之后由A返回给Client。

Client将块block分割成packet后依次发送给DataNode节点A,DataNode节点A收到一个packet后,将该packet从A发送给B,B在接受到之后传给C。A每传输完成一个packet后,就会放入一个应答队列等待应答信息,以确保A、B、C都完成packet存储传输。

当packet在pipline中进行传输的时候DataNode节点B和DataNode节点C会在pipline进行反方向ack确认,最终由DataNode节点A将确认ACK发送给client。

当Client接受到block的传确认信息后,向NameNode请求下一个block的DataNode地址,开始第二个block的传输。

HDFS读流程


HDFS部署服务器建议配置 hdfs客户端使用nio_hadoop_02


Client向NameNode发送请求,请求的内容包括:要读取的文件,读取的用户。

NameNode接受到Client发送的请求后,会查验这个文件是否存在,用户是否具有权限,若不符合则报错。若符合情况,则会返回block的列表信息,每个block的列表信息包括含有该block副本的DataNode地址。

DataNode的地址返回到Client后,会按照集群拓扑原则进行排序。

Client选取排序最靠前的DataNode进行读取block。读取过程就是与DataNode建立Socket Stream并调用DatainputStream的read方法来读取文件,直到这个block的信息读取完成。

当Client读取完NameNode返回的block列表之后,若文件还没有读取结束,client则会继续向NameNode发送请求,获得下一批的block列表信息。

在读取过程中,每读取完一个block后,都会进行checksum验证,若出现问题,client则会通知NameNode,并从下一个拥有该block的DataNode中读取数据。

当所有的block读取完仇,client会将读到的block汇总成一个完整的文件。

网络拓扑排序规则:网络拓扑结构中与Client距离最近的往前排,心跳机制汇报超时的往后排。确保距离最近,DataNode还正常工作。

在读流程中,NameNode不会返回块的数据,只会返回block的存储的DataNode地址。并且,在Client读取的过程中,通过read方法,会同时读取多个block信息。