HDFS上传
上传过程参考此图
首先,有一个200M文件要上传,那么Client首先要读取这个文件,Distributed FileSystem就是整个集群的抽象封装。Client向NameNode发起一个上传请求,NameNode审查请求是否合法(比如相同路径下已经有了文件,有没有上传权限等),之后回复响应可否上传。此时文件就被切了块,分成了128M+72M,如下图。
在这里插入图片描述
之后,往HDFS上传,要开一个输出流,FSDataOutoutStream,开了输出流之后,Client就请求上传第一块Block,即0-128M的文件。NameNode此时返回一个Node的list。如下:
在这里插入图片描述
你在文件里设置要存储到几个DataNode(比如3个),就会返回给你几个DataNode。其中第一个DN1是离Client最近的一个,后两个是根据DN1选出来的,(此处的最近策略,参考拓扑距离和机架感知)。之后Client就会向第一个DN1发起建立文件传输的请求,DN1顺次向DN2建立请求,DN2顺次向DN3建立请求。最后的DN3收到请求之后,依次向DN2发起应答,DN2向DN1发起应答,DN1向Client发起应答。当Client收到应答的时候就代表这个文件传输通道建立成功了。如下图:
在这里插入图片描述
Client此时开始向DN1传输Packet (64KB一个),DN1的内存buffer收到,一边往硬盘上去写,一边往DN2去传输。DN2同理,直到DN3写完把数据存到本地。
注意: 发送packet并不是等第一个packet发送完了才去传输第二个,而是顺序发送(感觉有点像计算机网络里面的流水线传输)最后直到第一块clock所有的数据(128M)传输完毕,接着开始传输下一块block(72M)。如下图:
在这里插入图片描述
第二次选择的DataNode是DN4,DN5,DN6,就证明两次的DN选择是完全独立的过程。
HDFS的数据存储的最小单位是块block,同一个文件如果分成了不同的块,那么不同的块有可能被存储在不同的DN上。
两种失败的情况
(1)建立传输通道的过程失败了。那么整个数据传输失败。
(2)传输packet的过程失败了。如果是C向DN1传输失败,那么文件传输失败。如果是DN1或者DN2向后面的DN传输数据失败了,那么上传是仍然可以顺利进行的,而且会返回给你成功信号,因为数据已经存储在了第一个DN1上。(设置的存储的DN数量是3,实际上只有DN1有,则会触发自动备份机制。)
HDFS下载
和上传的过程差不多,也实现建立一个DistributedFileSystem的封装,之后开一个输入流FSDataInputStream。C向NN发起请求,NN返回三个节点信息。C此时向第一个DN发起数据传输请求,请求若成功,则传输数据。如下图:
在这里插入图片描述
此时若DN1请求失败,则C向DN2请求,DN2失败就向DN3建立请求,直到请求成功。如果三个DN均失败,那么此次下载过程就失败了。
网友评论