00:00
好,呃,之前我们刚才提到的,说数据先写到WL,再写到麦,这个很合理吧。大家觉得应该没问题吧,对吧?呃,其实你在跟面试官聊的时候,你这样说也没问题,就怕人家深究,因为他实际过程不是这样的,但是你这样说没有问题,我们来看一下来。呃,从代码级别这个地方呢,有h reading这个。H reading,因为你现在操作的不是h reading,真正去写吗?他这个写操作在服务端是在这个地方来写的,就是你的看到W,还有这个什么,呃,Memory store都是在这个地方,那我们看一下这个里边呢,呃,我也不用去找那个代码,因为它这个代码的一个注释写的非常好啊,写的非常好,你可以找步骤STEP1。他有STEP1STEP21直到STEP8。啊,他告诉你,你不用看代码做什么事,来看一下是这个方法。最做最小的一个批量的一个提焦对吧?啊比交,那我们从一看第一步来看一下,其实跟我们操作没关系。
01:09
他说尝试去请求一些所。啊,我们可以的解锁,然后确保我们的至少能获到一个对吧,啊,请求。一些一些锁吧,啊这个呢,就是因为你要干什么。去写数据了啊,这个里边锁呢,用到的是GUUC的锁。GC的读写索啊,那你之前学过这个GC了,学过但是跟没学是一样的是吧,我知道啊,我知道无所谓,这个地方呢,就保证读写分离对吧?啊保证读写分离的,你知道这个事就行了,因为现在我又不可能把那个GC给你们上去了啊,就是它里边用到那个GC的锁啊,一个锁就是加了一个锁,因为你要写数据了,写数据的过程当中,我不想人家读,我不给锁起来,就这意思能理解吧,啊好,这第一步,那我们接着往下走,应该找到。
02:08
这个都是获取锁什么异常的,你看人家官方代码写的就是这些异常比较麻烦,因为人家要考虑什么很所有的问题都要考虑到,不像我们写的咔一抛是吧,啊无所谓了啊,所以你的代码简洁啊简洁,那我们找到第二步来。更新一下什么最后的一个时间,戳这个地方是干什么事的,这样我们是不是传输数据过来的时候。没有用传时间戳的那种方式,它也会添加时间戳,对吧,也会添加时间戳,那用的是服务端的时间戳,因为这些操作是你远程客户端发送请求过来之后,是不是服务端的操作。我们是不是发送过来吗?那最终是由服务端来做这个事儿嘛,所以他用的是服务端的时间,那也就告诉我们点,如果说你Windows时间跟Linux时间真的没办法同步了。
03:08
以后在Windows的操作不要自己传,时间拖能听懂。你不要system.current minutes,然后传进去,因为那个时候用的一定是你Windows时间,你可以不传,不传的话,即使你在Windows写的代码,它用的还是什么Linux时间中能听懂没问题吧,啊,尽量的去少传这个事就够了。好,第二步呢,去更新一下这个时间中,那我也不是我们关心的写数据流程吧,啊,往下走。哎,构建WL是不是先构建WL没问题吧,对吧,但是你要注意它这个时候仅仅是在内存的构建,并没有去写到什么。HD啊,并没有写,你要记住这个步骤,那先构建好,在内存当中呢,构建好,接下来我们继续往下走,那接下来按道理来说应该做什么事呢。
04:12
他说把这个东西啊,追加到最后一次编辑日志里边。因为你是批量的啊,批量的一个数据,一个数据都要写一次,这个时候呢,并不去看什么。同步,那这个同步讲的是什么事啊。写到ibss你能听懂啊,但是呢,这个时候他不写到,但是不写到它内存当中放的不是容易丢吗?对吧,我们继续往下走那。刚才第四步,第五步在做什么事呢?写内存了啊,那这个时候是不是大家想到问题来了,你W还没有同步到HDFS,你就写内存,你不怕挂吗?怕是不是啊,他肯定后面做一些操作啊,做一些操作我们继续往下看,这个时候写内存了吧,把数据写到内存当中,继续往下走,第六步释放什么。
05:05
锁了,前面是或许把锁起来,因为内存都写完了,是不是应该让人家读的呀,对吧?好,那释放锁接下来去干什么。同步了,哎,那大家想这个问题很严重啊,对吧,你先写到W,但是不同步,然后写到内存,最后去同步,那我内存写完了,这时候关掉了怎么办呢。对吧,继续往后走。因为整个的一个操作,他做了一个什么。叫do叫回滚,首先呢有一个什么对里面有事物啊,它里面有事物,为了保证这个数据执行,来看一下多back,继续往下走第八步对吧?啊第八步在这来看这个内容,嗯。你找一下,哎,在。第八步,他去真正去操作内容了啊,继续往下走,找到具体的内容在这。
06:10
第八步还要去做一些操作,对吧,最后做一些收尾操作,来看一下这个地方,他直接告诉你了。如果说W同步失败了。对,他抓异常过程当中,如果说失败了,他去把这个都说这个东西之前负值负的是什么,那这一块他在这个里边,我们看一下这个里边,他就把它如果说失败了,他就要去改成什么。处啊,改成处,哎,那个东西在哪了。怎么找不到了,第八在八后面还有九,第九这两部其实不是我们关心的,我们看到是这个人来。Finally里边吧,无论如何都要执行的内容,对吧?啊,如果说这个为false的话,需要走吗?不需要,如果为true的话呢。
07:06
Sales叫roll back回滚啊,其实注释也告诉你了做什么事了,如果说他同步失败的话。把所有的内内存当中那些东西在干啥,删掉吧,啊清掉啊,其实它里面做了一个事物一样的东西啊,做这个事啊,要必须保证这两个同时操作成功吧,做这个事了。啊好,我W入成功了,Memory写入成功了,这个事物完成了,你接下来挂了有关系吗?你WL是不是已经确保完成了,对吧?所以我们之前所讲的说先写到WL,再写到内存,这个有问题吗?表述上面没问题啊。能听懂吗?因为他是不是确保W写入成功才去。再去干什么,把内存里边东西写入成功吧,如果说他写入W写入失败了,内存当中也不要了吧,对吧,所以在表述上面,你跟人家描述的时候说先写到啊V,然再写到内存,这个没问题,就把人家给你深究对吧,人家说不对,那你说你看了源码其实也就那么回事,对吧?啊,其实实际过程不是这样的吗。
08:19
我这样说,我说先写到W,再写到内存有问题吗?没问题了,那他在整个源码当中是不是先构建什么,然后说写到内存,不是先构建WL,然后把W追加到上一次的最上,最最后一次的那W当中,但是不同步吧,再写到内存吧,写到内存之后就干什么。同步吧,啊同步如果一旦同步失败,就干什么回复了啊,实际上那这个过程我们把重新理解一下,说WL写入成功,再去写入内存有问题吗?没问题吧,所以人家跟人家说写流程的时候,你直接说这个点可以,当然如果说你对那个源码记得比较清楚的话,你直接说原码那个点也没问题,能听懂啊,但是为了简易一点,就是我们所说的,因为这样刚开始我们聊的时候是不是更好理解一点啊。
09:08
对吧,因为它有预写录制,我们先写到预写入制,然后写到内存,但实际上他真正在操作的时候,他不这样做的,对吧,他没有去同步啊,没有去同步,最后相当于做了一个事物,必须要两个全部完成,我这个事情能干什么?才完成啊,才完成,要不然呢。都不要啊,要不然都不要是这个意思。
我来说两句