hdfs的宏观写入流程:
1.首先就是客户端向NameNode发送写入数据的请求。
2.文件系统通过rpc调用NameNode的create的功能。与此同时NameNode会检查是否有这个地址或者说是有这个权限去创造这个文件。如果存在,则返回给客户端一个确认消息,表明-你可以写入数据了,并同时创建一个空的对象Entry;但是如果没有的话,那我就只能返回给你一个错误信息了。
3.当DFS接收到这个确认消息之后,文件系统就会调用这个create功能给客户端创建一个对象 FSDataOutputStream(文件输出流)给客户端使用。
4.然后客户端就可以通过NameNode拿到第一个块的地址了。(此时NameNode通过机架感知策略拿到最近的那个node节点)
5.此时客户端就会与NameNode节点创建连接(其中是通过pipeline(管道)进行连接的)
6.客户端将数据按照块的形式进行切分,但是发送却是按照packet (包)的形式来进行传输。(默认一个packet 大小为64K,一个块的大小为128M)
7.客户端通过管道将包传输到FSDataOutputStream对象进行数据传输。
7.1客户端首先将packet 发送到node01这里(不一定是node01,机架感知,谁近选择谁)同时给予node01一个ack状态
7.2然后node01将page传输到最近的那个节点,包括ack状态。
7.3此时就可以依照广播的特性,将这个信息传给所有的node节点,包括ack状态。
7.4然后此时最后的节点,就会返回给前面的节点一个true信息,而这个true也会被广播传递,然后返回到node01这里。最后通过管道将这个true返回给客户端。
8.客户端接收到这个true之后,此时就可以确认这个包传递成功,然后就可以传递其他的包,直到这个块的包所有包都传递成功。然后就会删除这个管道。
9.一个块传递完毕之后,就会去NameNode那里拿去第二个块的地址。开启下一个块的传递路子。
10.当所有的块都传输成功,客户端会向NameNode传递一个信息。NN确认传输完成。然后关闭FSDataOutputStream,最后在NN在Entry中存储所有的File与Block与DN的映射关系。
HDFS的微观写入流程:
1.首先客户端会将数据以流的形式将数据从硬盘上传输到缓存中。
2.然后缓存的数据以chunk(512B)和checksum(4B)的形式存入packet
3.当packet 满的时候,加入到dataqueue(数据列表)
4.datastreamer(数据流)开始从dataqueue队列上取出一个packet,通过FSDataOPS发送到Pipleline(管道)
5. 客户端发送一个Packet数据包以后开始接收ack,会有一个用来接收ack的ResponseProcessor进程,如果收到成功的ack
5.1. 如果某一个packet的ack为true,那么就从ackqueue删除掉这个packet
5.2. 如果某一个packet的ack为false,将ackqueue中所有的packet重新挂载到 发送队列,重新发送
HDFS读数据流程
首先客户端发送请求到DFS,申请读取某一个文件
/yjx/tomcat.tar.gz
DFS去NN查找这个文件的信息(权限,文件是否存在)
如果文件不存在,抛出指定的错误
如果文件存在,返回成功状态
DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
客户端获取文件第一个Block信息,返回DN1 DN2 DN8
客户端直接就近原则选择DN1对应的数据即可
依次类推读取其他块的信息,直到最后一个块,将Block合并成一个文件
关闭FSDataInputStream