00:00
好,那接下来呢,我们来看一下,哎,如何向这个data note里面去写数据,对吧,写流程,那写流程仍然我们还是把这个,嗯,对应的这个图啊截一下。下面这个过程也说上半部分我们已经完事了,那接下来从这开始。把这块拿过来啊,这块代码呢,还是比较复杂的哈。啊,就到这吧。OK,定过来。行,那下面我们看一下啊,如何来写的啊,那就点呗,首先点到这个right对吧,Right,然后继续right。啊,来到这之后继续往出写,往出写,那来到这儿再往出写。啊,往出写,往出写发言之后是一个attribute,那怎么办回退。然后。CTRL2塔加B,嗯,写那这里面有好多呀,啊好多,那我们选哪一个呢?选择这个FS。FS out put stemer啊选择它啊,选择它啊点进来,点进来之后呢,它通过这个plus啊buffer往出写,对吧,往出写,然后继续发放往出写,那写到哪呢?写到这里面有一个right truck sum trucks。
01:11
对吧,哎,这里面哎,你看一下啊,怎么写的,那进来之后,它这里面有一个right truck,还你看这个check sum,还有这个CH长度,那这个track是不是通过上面有一个啊,它可以进行一个计算啊,它可以计算校验和啊另一个呢,是这个串口对象,相当于现在这里面。我先写的是truck。以及上。按这样去为单位组成一个它啊,往出写啊,那你看一下吧,往进去继续往里走啊,走到这,找到这之后发现它是一个抽象的对吧,那抽象的回退,然后cerl out加B。那这里面找谁呢?找这个DFS output STEM,哎,进来进来之后,那这是呃,写出的一个准备,然后接下来current packet right packet right的这个track上卷盒,然后right date,哎,那你看现在不就往这写出去了吗?对不对,新在相当于哎,往这里面写了。
02:07
对吧,那再下一步是往往这个packet往这个队列里面去写了,嗯,那走啊,那这里面有一个队列current packet是否已经满,就是当前你这个packet这里面。是否已经满了啊,好,那看看呗,进来进来之后呢,仍然是这个队列current packet,判断它是否已经满了,然后继续wait and qui packet啊,继续等待,走到这之后往下看这个是不是又来到这个队列了,看这里面还是不是在等待,等待往下轴啊,什么等待,你看这块啊,这if,这个队列is for,如果说当前队列已经满了,然后但wait until。有足够的空间再往里存,相当于如果说当前队列已经满了,那我就不能再往这个队列里面去写了。对吧,但是现在你看我这个对这个任务是不是刚启动啊,刚启动这个data k里面是不是空的,那空的话,我是不是可以将pack里的数据往这里面写。
03:02
嗯,是吧,那行,那你说当前这个逻辑是不是就不会走啊对吧,那不会走的话,那他会走哪呢?走走到最后。哎,直接跳出来,跳出来之后呢,说队列package。啊,对着拍子那看一下他干了什么事?你把你这个package传进来之后,它是不是就把这个package传入到了data qui,你看添加到最后是不是就相当于往这填呢。I添加到这里来了。啊,他干了这么点事儿,那添加完之后,他还进行了一个通知。大家对这个队列不知道了,不了解哈,其实这是一发送这个通知,是不是就告诉这个队列,我已经向里面有数据了,有数据你是不是就得处理啊。对吧,你原来是位的状态,那现在有数据,那你就得往后处理。哎,那你捋一下逻辑,现在呢,相当于是我们已经数据写入到这里面了。OK吧啊。这呢,就是第一步,向date STEM队列里面写数据。那接下来那你写数据,那问题又来了,那我这里面是有数据了,那下面我要往哪里写呀。
04:05
对吧,那下面这这这这么多节点,我往哪个写,那你是不是得获取对应的这个啊块的一个机架感知相关信息了。对吧,哎,好。这时候怎么办呢?对吧,那你想想,我现在要等待它进行获取这个基价感知信息,那我是不是还得回到这儿啊,对吧?哎,还得回到这个里面,看它在run方法里面干了什么事,那好,那我们就回到这儿哈,所以说现在呢是哎主塞到这数据已经写完了,写完之后又回到这个data使对面了哈,别别别晕啊,别晕。那我们CTRL加N,嗯,Date STEM好吧,来到这。啊,来到这里面,然后CTRLF,那我们是不是得查找它对应的run方法呀,还记得它是一个线程吗?对吧,它是一个线程,那启动之后记得吧,正常这个里面往前走走,走到这儿的时候是等待呀,因为原来是空的嘛,等待,那新债是不是里面已经发了通知,说这里面有数据了,有数据之后是不是就get first获取第一个数据啊,你看你这不从从这里面取出第一个数据吗?然后准备要往出发了,那往出发那他还不行,还不能先发,他要干什么事儿呢?那往下走,你看往下走走到哪呢找这。
05:13
它在发送之前先set happily啥意思?我要先建立管道。啊,也就是说我得告诉他我往哪发,那好,那它建立管道,这里面有一个nest block outre啊这块呢,其实他就去获取对应的块信息,然后回来,然后再创建相应的流,那么来看一下是不是这样的哈,来点击它next block out streamam。点它,点它之后往下找呗,嗯。它这里面是。目标啊,你目标很明确啊,他是不是得跟name note英通讯啊,那你是不是还得找到对应的代理,然后往后走啊,啊是一样的哈,一样的往下走,嗯,往下看。嗯,这里面有一个看这块说connect to the first date in the list啊,那这里面叫是连接第一个输出流,那往前呢。
06:07
输出了对吧,那你往前找一下,那前面这块看一下叫locate following block,是不是相当于是我要查找哪些块啊,允许我去写呀,那好,那这里面应该会有跟name node进行,哎,这个跨进程通讯相关的一些内容,那看一看是不是呢?哎,你先看它啊,它完事之后才到这儿往出写,那行,那我们去获取一下这个可用的节点。那这里面说艾特block啊,添加节点信息啊块信息,那继续艾特,那艾特之后你看来到这块。DFS client,这个client name node I block这个熟悉吗?是不是相当于又跟这个name no进行通讯了?那好,那就CL out加B。那我们选择name noe rpc serve,你看来到这了吗?啊,那你说name no这边要接收到对应的这个方法对吧,也就说这块它接收到了这面传过来的艾特方法,那我要去获取哪些机架可以用,那其实新在这块呢,就是要机架感知这块内容了,比如说可以有哪些机架可以选择,那往后看呗,这里面有一个get adi block,那进来。
07:13
进来之后继续往下走啊,别着急。这里面说块信息啊,然后校验啊,没问题啊,Read block啊也不是,然后呢,验证I块信息啊,再往下诶看这块儿,这里有一个处置target for new block是不是选择目标的一个新块啊。对吧,因为我现在要往这个新的data节点上写数据嘛,其实写不就块吗?那好,那看一下,那进来进来之后呢,继续往下找,嗯,看一下说选择新块,你看哦,最后一行说出着target new block啊还是选择新块,那继续。那继续再往下看。嗯,往下找啊,这里面有他给的丝啊,那就往上找,往上找,哎,这里面这地方有一个触着他给的还是选他。
08:02
选择它之后继续往下看哦,仍然是选择节点,那继续哦,这是抽象方法,那你回退回来,回退回来之后,然后ctrl out加B。啊加B,那就跳转到这儿,跳转到这之后呢,继续这个选择节点啊选择对吧?哎,选择之后呢,来到哪个位置呢,往下看呗,这是选择节点往下走。往下啊,往下。诶,这里面仍然是选择吧,啊对吧,哎,继续再选择。那再选择的话呢,往下看。嗯,他就找这个他给的目标啊,就是你看你要选择哪几点,他写的还是比较深的。啊,Require type这呢,处置target in order,也就说选择啊这个允许的对应的order节点啊继续对吧,哎,走到这走到之后呢,再往下看。这个代码熟悉吗?之前我们在讲这个存储存储策略的时候,是不是大家看过这这段代码啊,那这块呢,是不是这个第一个副本选择哪儿啊,是不是选择local stories,选择当前的本地节点对吧?哎,选择它,然后再往下找,这是第一块,那下面第二块呢?第二块选择跟你当前机架不同的一个机架的一个节点,对不对啊,远程机架吗。
09:19
啊,跟你这个D0第一个啊,不在同一个机架上,你看第一块呢,相当于是在第一个机架本地,那第二块呢,是在远程机架啊随机一个,那好,那接下来第三块在哪呢?第三块首先它判断一下你前两块在不在同一个机架,如果在同一个机架,那我想办法第三块不在你这个机架上,是这样你选择吧,那正常情况下不会选,不会有这种情况,如果你是三个机架的话。那再来说这个,那正常下面新块的话,我就会选择local RA,但是跟随local呢,跟D,那是不是在这儿啊。哎,这就是计价副本的一个相关选择啊,也是这块啊,快的副本的一个选择,OK吧。行,那下面这个跳的比较深了,往回走啊往回走。
10:02
现在呢,是我们把这个节点位置选择好了。那还记得刚才我埋了一个伏笔,我说这个节点位置选完之后。你看这块选完之后,那接下来是不是就是创建这个block current这个out铺的stream吗?对吧,是它吧,哎,那我们就你看这块晕没晕到哪了,是不是到这啊嗯,到这啊,这个new那个nice的这个block out水啊在这里面,然后呢,接下来继续,哎,我要进行开始往出写数据了吧,你们节点我已经学好了。那进来,那进来之后看他干了什么事,往下看呗,啊一看前面这些应该没什么信息,往下走。看这块儿。这里面是不是开始获取这个输出流,获取输入流了。那他为啥有输出流,还有输出流呢?你看这面节点已经获取完了,那接下来我就要往里面写数据了。那有输入流,有输出流,那这是干嘛呢。你想我往出写是不是输出流,那我这边获取应答信息,是不是就输入流对吧?哎,所以说这个输入流啊,输入输出流都有,然后接下来。
11:07
往下看看这块。干完了。Send是不是RA写这个块信息啊,通过socket的方式是不是往出写呀,你看这不就开始写块了吗?对吧,那你点一下。是吧,这块呢,就开始往出进行一个写了啊,那这块是不是散的呀?哎,这是通过socket的同学啊,这个是烧同学,不是RPC,那它是往出写的话,有一个这个类型叫right block啊block类型那后面呢,我们会用到它。那你接收方是不是得也得能接收同样的这个类型的数据啊,把它定出来。哎,那现在呢,也就是说当前我们这个socket的发送也已经完成了,那下面我们来看谁呀,是不看这个socket的接收啊,那谁有这个接收呢?我发给谁了。我是不是发给这个data note了,那data note是不是得有这个接收这个烧的信息啊,那我们说了这个data note当中期间讲data note时候有一个服务还记得吗。
12:05
Data叉server啊,这个服务我之前说他非常重要啊,因为他就是来接收这个对方发过来消息的,那好,那么来看一下哈,就他来接收。那这里面得CTRLN,那这个名字叫嗯,搜索date。叉啊叉,然后呢,Server对吧,这个服务端点开它。那点开它,它进行来一个接收,那它是一个线程,那你怎么找他呢?找他的run方法就行了。对吧,那也就是说开启这个线程,因为之前我们在启动的时候,是不是就已经把它给初始化好了啊,就已经启动好了,那直接看它的热方法,它干了什么事呢?它这里面是不是接收Cha接收信息啊,接收信息之后,它这里面有个data叉server,然后create。相当于是呢,这个线程又开启了一个线程,叫date,差什么。我本身是一个线程服务,我在这里面又开了一个线程,这成是吗?然后呢并start。
13:06
那这个你怎么看,比如说这个线程start了,相当于我是不是得我得进去吧,来这吧,来到这找他什么方法,是不是找他的run方法。那线程嘛,线程使动就走走这个嗯,RA,那走RA的话呢,看能干什么事。那这边呢,仍然是走这啊,这里面有个date叉server看到了吗?啊对吧,这个服务啊往下走,那你这里面接收到数据之后,它有一个right block这个类型,然后往这个block里面去走啊嗯,往下看。往下看。找。哎,找到这啊找到这这个往线往再往上找一下,往上找呢,这块呢是读取了一个op类型,还记得这块吗?我发送的时候,你看这里面是不是有个op right block对吧?啊其实这块呢,就是获取到对方发送过来的是一个什么类型,明白吧,那然后到这块呢就可以呃,进行对这块的类型进行一个操作,那看没,那我们现在发送过来的是不是right block,那是不是这个方法。
14:09
对吧,那我们就执行他,哎,那接收到的消息是这个消息好来到这,来到这之后呢,他干了一件事叫right blog。往出写,你看写那就这么一个,它那点呗,嗯,点进去。王周杰。哎,这是抽象的是吧,嗯,回退回来。查找它的时间内CTRL2加B对吧,哎,CRL加B,那它呢,是一个date差是不是啊,来到这里面,那来到这里面呢,你继续往下看啊往下看。这个服务开起来之后,看他干了什么事。往下走,往下走。Check啊,校验这边内容比较多啊,比较多。找一下啊,找到这个位置哈,这里面有一个这个set current啊block receive,然后这里面有个get block receive,那这块呢,其实呢,哎,就是要向这个磁盘里面进行写数据,那么来看一下啊,嗯,往下走进来。
15:05
进来之后呢,这里有一个block receiver。继续。往里走,这是你有这么一个对象。往下看。哎,那我们现在这个是什么阶段啊,我们是不是这个管道建立阶段呢?对吧?哎,管道建立阶段,那管道建立阶段,然后data node create r bw啊其实呢,这是一个什么呢?相当于向这个磁盘里面去写文件。哎,是写文件的,写一个临时文件,那为什么他不是一个呃中级文件呢,记住他先写一个临时文件,最后把这个名字啊写成这个final啊finalize的啊,最后一个改名字哈,就是这块呢,是往出写写文件的一个过程哈,那简单看一下就行了。呃,来到这儿之后,那你你要是。写的话还得找他实现类啊,Ctrl out加这个B。对吧,嗯,找到时间类,然后呢,继续往出写。呃,LA writer,然后这里面你看这里面是有这个磁盘呢,啊,这是磁盘的含义啊,多磁盘,因为呢,你可能有多块磁盘,那我通过它呢啊就往外写那行,那这块呢,诶那假设他我们已经写完了,那写完之后回退回退回退到这儿这个地方是不是open,然后往外写啊,那咱说了他往外写的同时,它是不是还往下一个date note发呀。
16:23
对吧,是不是这个逻辑啊,那你看那这块它发写完之后往下找,你看这块,如果说这个目标target大于零什么意思,就是你连接的这个节点大于零,是不是有多个呀,我们现在是不是有三个,那它继续往下走,往下走什么呢?你看往下。往下走,往下走看这块儿。它仍然要往下一个节点继续发送,哎,仍然是这个send,对吧?Send之后呢,又是red block,那发给谁,这次他发给谁了,那这次就会从DN一发送到DN2,那DN2怎么操作,DN2是不是也得看一下这个data server这个服务,然后继续开启它,然后走到这儿,对吧?然后呢,他得往磁盘上写,写完之后是不是他得往下一个节点写,那到了这的山是不是也是如此往复的这样去做呀?
17:11
哎,这样就形成了一个啊流对吧,哎行,那你现在是写,写完之后,最终他是不是得写完之后进行一个应答应答应答最终得应答到这啊。对吧,那应答完之后,看他是否将这个应答里的信息删掉。对不对,哎,是这样的过程,那行,那这里面呢,我就给大家看一下谁呢,直接看一下这个data streamer,它这里面的应答是怎么样的。好吧,啊,那么来看一下啊,那怎么看一下它这里面应答呢,那你还是来到这个date实际模啊这个类里面去,在这呢,就在这呢,你看人找也行,然后这里面找谁呢?仍然是找这个乱方法对吧。它是个线程嘛,啊,找到这找到这里面,呃,我们看一下,哎,正常的,你这里面是这个队列,哎首先呢,是空的队列,等待等待之后,然后这里面get first对吧?啊有数据了,有数据之后呢,它会去建立这个管道,对吧?啊建立管道,建立完管道之后是不是就开始发生数据了,那发生数据的话,那你看一下它,哎,它是干什么呢?说init date11米,哎相当于是一个啊应答一个反馈,我们来看一下啊。
18:19
你进来,进来之后,你看这里面是不是有一个response process。对吧,接收你对方发生的一个情况是否OK,那你看他又调用了一个start,你看这个start是什么,是不是还是现程啊,那你回头来,那遇到这种情况怎么办了,还记得不?哎,那你是不是得点开它,然后搜索这里面的run方法呀,那run方法那这个就是呗,对不对?哎,这个线程里面的run方法,那run方法里面干什么事呢?哎,它往下走收集。收集信息。往下看。继续往下找,往下找找这辈子。看到了吗?哎,如果你收集这个信息,哎,正确的话,它会干什么事呢?将你这个ack queen remove first是把它移掉啊,哎,也就说你这名发送过来数据,你这个发送成功,那我将这里面数据删除掉。
19:11
哎,如果你没发送成功的话,那我这边还得继续移到这个data k的守位置,那这不就是应答吗。对吧,那这个应答响应好,那么再回退回去啊,回退回退回退对吧,那这个地方你建立管道发送数据,那这块呢是应答对吧,那你往下看往下看。看一下这块呢,是他要往出写数据的时候,其实是这块。他往出写数据的写烧的时候,他这个队列干什么事呢?哎,先remove first,他会将这个数据啊,Packet先写掉,一定一定他并没有真正的这个发出去,他并没有真正移调啊,它会给它加到哪里呢?加到这个位置,加到这个a cck queen里面看到吗?加到这里面。哎,是这样一个连锁反应哈,对吧?啊,这这个你能看懂吗?嗯,然后呢,往下走往下走,然后下面呢,是。
20:03
真正的这个写数据是通过这个哈,Right to啊,把这个块信息往出写,那这块写的过程啊,就不给大家这个说了啊,这这个呢,就是整个这个数据的一套写流程啊,那我们来看一下哈,呃,给大家回顾一下。混一下来到这个整体这个位置哈,这个都删掉。还是来到这张图,那如果面试官问你这个上传的源码对吧?哎,你是,呃,看没看过,那怎么说,那肯定看过对吧?那接下来他会面试官会问,那你看过之后,那你给我说一说吧,那你怎么说呀,那你会把这里面这个所有的方法都记下来吗?不太可能,对不对?诶那你首先要知道啊,仍然是我这个客户端这块创建了一个RPC客户端,然后呢,发送给这个name note进行请求,那name not进行一个判断,判断这个文件,嗯,这个路径是否存在啊,是否可以这个有权限进行一个添加,对吧?哎,然后沟通好之后,那接下来这个客户端要干一些什么事,他创建了一个data stream。
21:06
哎,穿了一个,它它这里面呢,存储了一个队列啊,管理一个队列,这个队列呢叫dead,然后在这进行一个等待。对吧,然后呢,同时他这边又跟这个name note进行一个获取,说我要获取哪些节点,我允许往这个did note上去写。对吧,那这是感知相关事好。获取完毕之后,那才才才开始真正的进行写数据,那写数据的话啊流对吧,哎先写的是truck啊sum,然后写packet pack呢他要往这个data馈里面进行一个写,那看他这个哎是否满,如果满的话,那要等待没满的话就可以往里面写了。那好,那他写完之后,他会通知这个队列说我已经往里面写数据了,那接下来的事情就由他三零登场,他呢准备开始往出发数据,那发数据呢,他首先呢,是把这个数据啊先干掉。
22:02
对吧,哎,然后放到这里面一份,然后发出去一份。啊,他先发,发完之后干掉啊,是这个过程OK吧,好,那他这边一发的话,那是由这个date note对应的服务,你不用说这个名字啊,你说对应的服务来接收对应的数据,那接收完数据之后呢,他先把数据持久化到磁盘,然后同时又把这个数据发送到下一个节点。对吧?那下一个节点仍然是接收数据,持久发到磁盘,然后再发送下一个节点,对吧?如此往后发,发完之后呢,对方开始应答,开始应答,开始应答对吧?直到应答到这儿,那他收齐了三个应答之后,它会告诉这个AC队列我已经收齐了,那你这个数据呢,已经没有用了,可以删掉。哎,如果说没收齐,那怎么办呢?告诉你这队列啊,保存那之后呢,他又把这数据移到这个电子库,它再次往里面写,再这么写,再写。啊,这样操作流流程啊,这个呢,就是ADS啊上传的一个源码。呃,还是非常复杂的哈啊,建议大家呢,这个多看几遍OK。
我来说两句