00:00
好,接下来我们来看一下HTFS上传的一个源码,那这个源码呢,是相当有难度的啊,那这里面我们最好是多分几个模块给大家去讲解,那这个时候呢,一定要这个清醒再清醒哈,反复强调一下,那下面我们来看一下哈,看它的一个复杂程度啊是什么样的。呃,首先来看一下这个我们以前讲的as写流程,好吧,那我们稍微回顾一下啊,那这里面呢,右侧呢是一个集群,有name node,有node,好,左侧呢是一个客户端,它要将这200兆的文件上传到name note集群,那首先它有一个APS客户端,对吧?那咱们说了这个客户端呢,它是一个分布式的文件系统,因为本身这面ADS它就是一个分布式文件系统。那行,那他创建完之后呢,他会跟内蒙进行请求,说他要上传对应的文件,那对方呢,要对他进行相关的权限检测以及目录检测,你就判断它是否存在对吧?诶OK。那传过来之后,那接下来那这边给他一个响应啊,判断完之后说允许进行一个上传,那好,那接下来这个客户端,他就要问这个集群说我要去哪对吧?嗯,哪几个带note上写数据往哪上写呀,因为你这不只是三个呀,有可能是十个或者20个对吧,我只需要挑三个就行了啊。
01:18
那好,那他。发送过来之后,那这边呢,要根据副本的一个存储策略,诶给他返回三个节点,那这三个节点呢,它是按照这个负载均衡,以及节点距离最近哎等等情况进行综合的一个选择,一会儿我们来看这段代码好吧。那接下来,那这边这个请求好之后,它会创建一个FS,嗯,Date这个output stream,也就创建一条流,然后往date not进行写,对吧?那写的时候呢,咱们说要先建立的是管道啊,建立完管道之后,然后进行应答,哎,管道打通之后,他才开始写数据,而且写数据的时候呢,它是先形成的对应的truck以及truck sum,哎,形成一个小包,把这个呢,发成一个包,以包为单位,然后再往这边去发,那么一个包的大小呢,是64KB。
02:10
那他写的时候呢,它是一部分写到这儿之后,一部分是持久化到磁盘,一部分在内存当中,直接往下一个节点进行连续的写啊,写到磁盘再写对吧?哎,然后呢,最终呢,这块还要进行一个应答。这样一套流程,那这个是一个简略版的一个啊,这个写数据流程,那下面我们来看一下这个详细版的啊,这个写数据流程哈。还是比较震撼的啊,首先呢,我们这里面哎,代码里面FS create也是创建一个啊路径啊,然后进行往下走对吧?哎,那这是一个分布式文件系统,有一个stream流,然后通过RPC客户端,那这边呢是date,那这个客户端对吧,这是一个客户端,那我要跟谁进行通讯啊,我是要跟NN进行一个请求啊,那好,那这里面又涉及到了一个RPC通信,好。
03:00
啊,那这面也有可瑞的方法进行接收,接收完之后诶调用这些内容,然后他会检查自己的这个目录数啊,你往这里面添加的时候,他要检查检查看看你这个文件是否存在,有没有权限,然后呢,写入到对应的啊这个目录数里面啊,这是它的一个过程,OK吧,那写完之后,那接下来他进行下一点操作。他继续呢,创建流啊,它得要往出写啊,它得有流对吧?哎,他创建一个流,那这个流这个是计算这个相应的这个啊计算大小哈块大小一百十八,呃,这是告诉你相关的一个单位对吧?嗯,然后后面它开始启动一个这个线程啊date stream它很重要,它这里面存放了一个叫date queen这么一个消息队列。哎,这个队列里面未来就用来存储数据,就是它。那你这个本地得有个文件啊,那本地文件那就是用它FS啊right往出写,那你得先把这个流打通啊,啊right啊right它先写的是这个,看到吗?Truck加some形成一个小包,一个小包之后,然后呢,再往这个package里面写啊,一共写多少个,写127个就形成一个packet。
04:11
哎,它这样是分批写的,他为什么物留着按字节一个一个写呢,因为这个大数据啊,还多和这个数据量处理的比较大,那你按一个字节一个写呢,效率比较低,所以说呢,它是采用这种啊方式进行写的。然后他把这个package呢,一个一个package写入到这个数据队列里面,那你看刚才是这个主摄状态对吧,这个队列是主摄没有数据的空的嘛,等待那一旦写到这里面是不是就有数据了,那有数据之后,他是不是得往外写呀,那往外写的话,那他就得去跟这个name note进行交互,获取到我要往哪几台服务器上进行一个写,所以说又涉及到一个RPC通信啊,获取到你可以写的节点。然后那这里面它获取到要像DN1DN2啊,这个DN3进行一个写数据,那他这个写数据呢,是采用这个socket的方式。
05:02
哎,Socket写这个packet往这里面写,那他写的同时怎么写呢?他是把你这个块对吧,诶写到这里面,通过这个socket往这里面写,OK吧,但是写同时呢,他又把这份数据呢,又备份到了一个A队列。他为什么要备份到这里面呢?哎,防止你这次写失败之后,那这里面给你存着,然后再给你添回来啊,是这个作用哈,啊,所以说他同时往这里面写的时候,同时又备份了一份,OK,那他开始写,那写的话,你看我这面是不是客户端呢?那我这面是DN1是不是又是跨进程通信呢。那跨进程通讯,那你这边也得有对应的接收服务,哎,他来接收对应的数据,诶,它又启动了一个data叉啊,这个server服务,然后这里面又调用了一个block server服务,那到这个服务里面,他干了一个什么事呢?他首先把这个数据持久化到磁盘,然后又从这里把这个数据又写入到下一个节点。你看它同时返回三个节点嘛,对吧,三个节点它是写完这个这个块往这写一份,就往这边写一份。
06:05
哎,这样去写的哈,写完之后,那你看那他这边是不是负责接收啊,哎,接收到数据之后,他又串联一个他,那他是不是也往出写呀,那写的同时是不是就往下一个节点有写呀,哎,就是这样一个派开的一个派往右写好吧。那写完之后,那接下来那写没写成功呢?那贝塔三是不是要给他一个应答呀,告诉他你是否写成功。对不对,那他呢,是不是得告诉这个说你有没有写成功,那他呢,他是不是得告诉告诉我这个客户端有没有写成功啊,那客户端他是不是也得有一个对应的接收的服务啊,那他也有一个接收服务叫response啊,这个pro啊,那好,那他呢,接收到这个请求,也就说诶接收到你这三个应答123对吧,他最终都汇总到这儿啊,汇总到这儿,然后他就给他,那他接收全了之后,他会干一个什么事呢?如果正确的接收了,他会把这里面的数据删除掉。
07:01
因为你刚才这里面往出发的时候啊,他一发完之后就把这个删了。哎,那现在呢,他这边也收完之后,那我就让你删了,那那反过来,如果你这个响应告诉他说我没有收成功,我这派没收成功。那怎么办?哎,那这个时候相当于你刚才发那个失败了,那他会把这个呢,又写回到这个date困里面,然后再次进行重发,那同他写过去之后,那这里面数据也给它清空,能懂吧,然后他一发的时候是不是又把这里数又备份一份。哎,这样如此往复的去一个运行,呃,看起来比较复杂对吧?哎,那接下来呢,我们就看一下这个源码它到底是怎么走的,OK吧。
我来说两句