00:00
好啊,等我们把master的结构和reading serve的结构全部了解完成之后呢,接下来我们就要讲具体的读写流程了啊,可以想象啊,呃,H base呢,作为一个数据库啊,它最核心的内容也就是读写流程了啊,我们只要把握住这个核心,诶,那基本上呢,这个h base的功能啊就八九不离十了,我们首先呢来看写流程啊,打开PPT。好,那写流程呢,是从客户端创建连接开始的,到最终刷写落盘到HDFS这个数据啊,你从啊调这个命令开始,然后最后呢,一直到刷写到HD上去结束啊我们这里呢,因为已经写过h base port sal这个API了,对不对?那这里呢,我们可以跟API完全的结合在一起,大家可以回忆一下我们在写h base这么一个API,写流程的时候,你最开始做的事情是什么?啊,最开始做的事情是什么?可能有的同学呢,觉得我们最开始做的事情啊,是这个new了一个table对吧?哎,咱们还有代码呢,哎,不妨,呃,如果忘的话还可以大家回顾一下啊呃,有的同学呢,可能觉得我们最开始做的事情呢,是。
01:10
做了一个table啊,其实不是这样的,你看我们这个地方能直接调get table是因为什么呢?是因为我们在整个GM。类加载的时候已经创建了这个连接啊,已经创建了HP的连接,所以我们真正要追根到底,它最开始的这么一个写流程的话,它应该从哪开始呢?从你创建这个连接开始,那么在这个写流程里面也会给大家揭秘一下,为什么HP的连接它是一个重量级的连接,它到底重量级在哪了啊,那咱们呢,就从创建连接开始介绍起啊,再打开这个PPT。好,这是我们对应刚才的那么一个结构啊,这结构呢还是不变的,里面的东西呢都还在对吧,只是呢,我把这个地方的一个哎读缓存给删掉了啊,因为在写流程里面跟读缓存呢是没有关系的啊好,咱们开始这么一个流程,那你首先呢,在你的代码里面,也就是你的客户端里面,对吧?第一步向ZK发送请求,创建连接,这是什么?就在创建你那个连接,还记得吧,咱们在创建h base连接的时候写的那个地址是组K的地址。
02:19
啊,是组K地址,而我们的I base客户端想要去出一个连接,它需要首先访问的就是组K板,啊,首先访问的就是组K板,他为什么要访问组K呢?这一个流程就表示了它是一个重量级的连接,他访问组配派要的是这个MAT表存在哪个地方,还记得MAT表吧,咱们专门有详细介绍过,它本质上是h base一个基础的表,但是他的身份比较特殊,如果想修改它要经过master,但如果你想去读它找他的话,不用问master master只负责修改写这么一个表,如果想读,你去找组K就可以了,组K会告诉你这个表在哪。那比方说呢,我们这里面,例如呢,他在这个103上啊,由这个103的region server来进行管理,管理这么一个MAT表啊,那如果他来管理这个MAT表呢,我们就去访问103,读取这么一个MAT表啊,读取这么一个MAT表,他会把这个MAT表呢,整个的数据啊全部读取过来,作为。
03:20
Math catch缓存到这个客户端里面啊,缓存到这个客户端,你可以看到我们现在还啥都没干呢,仅仅是创建一个连接啊,但是它底层做了非常多的事情。最核心的事情就是把这个原数据表整个表给读过来了,哎,那你说原数表能有多大呢?啊,咱们随便说一个数啊,可能大概就在这个范围对吧,它保底呢,有个几兆,十几兆,20兆啊,或者几十兆应该是有的啊,在企业的开发里面对吧?在咱们这个案例里面,它肯定没有啊,但是在企业开发里面,它有个几兆应该是挺正常的,对不对,因为他是把所有的表的所有的瑞,所有的各种管理信息全部都给拿过来了啊,全部都给拿过来了啊,就因为这么一个动作导致了创建h base的连接。
04:05
它是一个重量级的,因为它整个表都给拿过来了啊,缓存在了内存里面啊,混存在内存里,好这一步呢,就是我们在静态加载的时候创建连接这么一步,当你创建完连接之后。啊,创建连接之后,接下来呢,我们就可以开始去,哎创建那个table,他说table是一个轻量级节点,因为table其实啥也不做啊,Table其实是啥也不做了,一直要等到你调那个port命令,它才会有具体的一个操作啊好接下来呢,我们就会去发送破命,好在发送破命令的时候呢,你可以看到前后啊,它会有一个时间的一个间隔。再或者说呢,这个连接由于是单立的,你第一次创建获取到了这个MAT表作为一个缓存,对吧,但是你隔了十分钟之后,你再来发送请求要去,呃,写入一个数据的时候,那这个ma表是不是就有可能发生变化了呀,因为master那边持续的不断会去修改这个ma表,如果它发生变化会造成什么事呢?就你发送的这个port请求啊,他找不到。
05:07
对应的一个位置啊,找不到对应的位置,你看我这个图里面,直接把这个破请求给到这个102了,为什么?因为我要破的表是由这个102管理的,对不对?我怎么知道他在管理呢?Ma表里面写的有吗?对吧,但是经过一段时间之后,可能这个102已经挂了,我要找到这个表对应的reading的store,它这个东西呢,已经交给别人去管理了,那对应的我这个put请求不就发送失败了吗。对吧,就发送失败了,发送失败的原因就是你的MAT表的数据出现问题了啊,那这时候呢,就有了,如果你发送的请求诶失败了导致呢这个呃,证明呢,这个MAT表呢有变化了,那你需要重新再去走这么一遍流程啊,再走这么一遍流程,再把这个MAT表呢缓存到这个内存里面。啊,换向内存里面,那他比较核心的其实就是这一步啊,其实是这步,一旦他找到,一旦他有一份新的这个Mac表之后呢,在接下来的写请求其实就已经啊顺理成章了,你发送一个put命令的时候,你一定要写什么写你要写到哪个表,对吧,比方说student表。
06:14
除了要写到哪个表之外呢,你还要告诉我RK对吧?1001好,我有了RK之后,我是不是就能找到对应的一个region了呀?有RK不就能找到region了吗?对吧?你除了写呃R之外呢,你后面还要写你要put sal嘛啊,一个一个sal是拆分开的,你要put sal的话,你还要写in for。Name是这样吧,你要写全嘛,In for name,好,我有了in for name之后,我就知道你是这个reading里面的哪一个store了,它要精确的非常准确的一个精确这个store。自行确到这个道之后意味着什么?意味着我这个波测请求,这条数据我就知道写到哪个写缓存里面了,你得对上号啊,得对上哪个写缓存,但他会不会直接写到写缓存里面呢?不会啊,不会直接写到内存里面,不安全,因为这个数据呢,会在写缓存里面保存相当长的一段时间,要排序嘛,啊保存那里主要的目的是为了排序,那在这里呢,你正在排序呢,结果它电断了,数据就没有了,非常的危险,所以他不会直接放到写缓存里面,不会直接去排序,它会先经过预写日志,把这个写请求经过预写日预写志抓紧时间把这个请求呢给它落盘到HDMS里面。
07:25
啊,给它落盘到这儿,落盘到这之后,这个数据呢,再给你写到对应的一个企业缓存里面,放到企缓存里面就可以排序了,啊,就可以排序了,保证ROK始终是有序的,数据里面的ROK始终是有序的,好经过一定的刷写条件,就是经过一定的时间或者一定的大小,咱们等一下会详细介绍啊,经过它达到一个刷写条件之后呢,这个数据会保持一种有序的状态,刷写到对应的一个store里面啊,每次刷写呢,生成一个新的文件,在这个文件夹里面形成一个新的文件,你可以叫它h fair,可以叫它store fair,那都是一个意思,在官网里面它也说了这两个词,其实就是一个意思啊,刷写到对应的文件里面啊,经过这个刷写流程呢,我们也可以很容易的看到。
08:12
最底层的H这么一个一个的文件。啊,它也是只能保证单文件有序。文件与文件之间是无序的啊,单文件因为它每次刷写生成一个文件嘛,那你这次刷写跟下次刷写生成的文件之间是没有办法排序的,它的排序的操作都在这个写缓存里面,单文件是有序的啊,单文件是有序的哎,仅仅是保证单个文件有序就已经足够了,可能很多同学就经想到,哎,那他读的时候怎么办呢?不要着急,马上读的时候就告诉你他怎么样读的又快又准了啊,那这里呢,就已经把整个的写流程啊给我们画出来了,那主要的步骤呢,主要就是这个哎。最开始创建连,为什么重量级连接,因为它真的要把一个MAT表全读过来,保存在内存里啊,主要就重量连接在这儿在这儿了,后续的操作呢,都是比较快的啊,都是比较快的啊。
09:07
好,这里也有啊,先写入wal预写日的原因呢,是数据在memory store里面排序并保存一段时间,存内存呢不安全,数据写到memory store之后啊,就已经会返回写入成功的一个ACK的一个指令了,那此时宕机呢,你可以通过W预写日呢给它找回了啊什么时候返回CK也比较重要,对吧,我这个数据呢,一旦写到写缓存里面,哎,就已经返回CK了,说你已经写入成功了,那这时候如果挂了怎么办啊,挂了呢我就停止营业。等这个re交给他管理的时候,他去读对应的一个水日,把这个操作呢,再来走一遍就可以了啊,这是我们完整的一个写流程啊,这底下呢,也会有对应的一个,哎。文档的一个介绍啊,呃,正如我们API的编写顺序,首先创建H重量级的一个连接访问组,来找到这个MAT表位于哪个region server,然后去访问这个region server,获取这个M表缓存在连接当中,作为连接属性ma catch啊,会有这么一个属性啊,你点我们这边connection这个类,它会有这么一个属性,专门就是存这个mad catch的。
10:14
好,由于Mac表格呢,具有一定的数据量啊,导致了这个创建连接呢比较慢,慢就慢在这儿了啊,之后再获取table,它都是一些轻量级的连接,因为只在第一次创建的时候呢,会检查这个表格是否存在,会访问一下,就是说我们在使用table的时候啊,就是只是简单的检查一下,它不会真的去频繁的访问,也不会就有什么复杂的一个交互,所以它呢是一个轻量级的连接。调用table的po的方法写入数据,此时还需要解析,OK,对照缓存查看具体的一个写入位置啊,找到写入位置之后呢,我们先追加写入到预写日志里面,此处写入呢,是直接落盘的设置,有专门的线程控制预写日志的一个日志滚动啊,这里呢,类似于我们这个框架啊,里面通过三个参数来控制滚动,那它呢,也差不多一个大小,一个时间,对吧。
11:04
好,再往下呢,根据写入命令ROK和列足查看具体写到哪个memory store,在memory里面排序啊,返回ACK,等待刷写时机,将它写入到对应的一个到里面作为一个文件落盘,好作为文件落盘之后,我们的整个写流程呢,到这里也就结束了。
我来说两句