00:00
好,介绍完整个的文件结构之后呢,接下来我们就来看读流程啊,打开对应的PPT。好,我们的读立流程呢,也是从客户端创建连接开始的,而先要创建出那个connection,然后呢,你获取table,获取table调get对吧,这一步一步的流程,到最终呢,合并数据返回客户端为止,哎,什么意思呢?你读取数据你要用点返回对不对?到点返回最终的result为止,这是我们完整的一个读流程,那么它前面创建连接的整个流程,以及我们呃,H base和HDMS存储的这些东西呢,都是一样的啊,左边是创建连接对不对?还是先由主K发送,向主K发送请求创建对应的一个连接,还是先要去找MAT表的地址,找到之后把MAT表呢完整的读过来,缓存到MAT catch里面啊缓存下来好,如果这个MAT catch呢发生变化,还是需要去更新,它前面的流程跟写流程是完全一样的,不一样的点就在于它在发送请求的时候,这时候呢就是发送一个get请求。
01:08
发送一个get请求啊,这个读啊,哎,在我们的h base结构里面就会变得相对比较复杂啊,因为写的时候相对比较简单,你不断的往里面追加写就可以了,因为它有那个版本嘛,对不对,好,那你读的时候就费劲了,你要把所有的版本都给它读出来。好,那你为了保证所有的版本都给它读出来,你一定要读三个位置啊,一定要读三个位置,哪三个位置呢。那首先这个流程呢,还是先走预写日啊,把这个东西呢给写到预写日里面,然后接下来先要读什么,先要读block catch啊,先要读这个读缓存啊,先要读缓存好读这个对应的读缓存呢。主要是为了让他这个效率啊更高一点啊,之前读过的数据呢,会缓存在这个读缓存里面啊,会缓存这个里面,你下次呢,直接再来读就可以了,当然你这次直接读读缓存里面的内容,它一定是正确的吗?啊其实这里还是有个问题的,对不对,你这次你上次读了1001的,结果他给你返回一个张三。
02:13
你这次再来读1001的结果,它一定是张三吗?哎,是不是有可能发生版本的变化了呀,所以这个读款图啊,并不简简单单就是它的名字叫block catch,并不简简单单单是缓存了键值对的那个block块就64K那个块,并不是这样,它主要缓存什么呢?主要缓存原数据啊,主要缓存原数据对呢,就是我们之前说的那个伪信息。啊,那个伪信息他读到那个文件的原数据之后呢,他会去对应啊,他这边呢,马上就会去这个文件里面去对应,如果伪信息是完全一样的,说明这个文件没有发生过变化,上一次读到这一次可以拿来直接用,如果发生变化了,还需要重新读,把原来的缓存给删掉,然后重新来读啊,结构还是相对比较复杂的啊,相对比较复杂的好,这是第一部分,一定要读读缓存,效率呢,能够更更高一点,读缓存里面也有大量的一个原数据,方便他查找对应的一个地址,除了读海伦之外呢。
03:12
最主要的一部分,我们要读这个对应的store里面的文件,对吧?读缓存里面呢,会优先缓存索引文件,不能过滤器和K值,也就是原数据里边的内存呢,是按照64K来缓存数据的,清理的时候它主要它不会清理这些东西。不会清理所有文件,也不会清理布隆过滤器跟这个原数据,它只会清理KV间段64K的那个数据,只会清理数据,那清理数据呢,就根据活跃度来,还有就是诶,你是过期的,那自然也要清理掉啊,你长时间没有人用了,也给你清理掉,我们GVM的整个的垃圾回收主要清理的就是这个读缓存,因为读缓存里面的数据不重要,你垃圾回收肯定要这个回收不重要的,对不对,我们主要回收的就是毒缓存里面的数据啊,就这里面的数据啊。好,那对应的再往下。
04:01
哎,再往下他还需要去读取写缓存里面的数据啊,还需要读取写缓存里面数据,原因很简单,因为这个数据啊,可能是刚刚写进来的新版本的数据,还没有去,来得及落盘呢,那你在读的时候要把所有的版本读全,所以读缓存里面数据也要读啊,写缓存里面数据也要读啊,两部分缓存呢都要去读啊,不过这个呢,影响到不是很大,因为写缓存呢,也是在内存里面,同时缓存始终保证数据是有序的,你想要读这个内存里面的数据,并且是有序的,速度非踌快啊,速度非踌快,他已经给我们设计好了啊,那最终一部分要读的数据呢,就是文件里面的数据。这个文件里面的数据啊,是最慢的,一方面它要读磁盘,那并且要跟HDS产生一个读写交互,这速度是非常慢的,对不对,主要慢的点就在这个读文件上面的,其实读这个读缓存也好,读这个写缓存也好,都可以看作是不怎么耗时间的,非常非踌快速的,而着重比较慢的就是读这个文件里面的啊,HDS文件里面的数据啊,针对文件里面数据呢,它进行了大量的优化,这个优化的包含有文件是带索引的,是拆成64K小块的,带有布隆过滤器,带有原数据,你可以很快的找到,同时呢,所有的原数据都会缓存到这个block开里面。还有一个点就是如果这个文件呀,长时间存储在hdi上面,没有经过写,没有经过修改,一直就用来读的话,那事实上这个文件不会被读多次,只会被读一次,读一次之后结果的那个block catch block块数据就会被缓存到这个读缓存里面,下次读的时候呢,直接拿来用就可以了啊。
05:41
我大量的优化,等你把这些所有文件的地方啊,数据全部读完之后,来最终合并所有读取的数据返回,怎么合并呢?高版本的覆盖低版本的,如果你只要一个版本的话,它会完全对应,最终只得到一个最高版本的啊,得到一个最高版本的返回就可以了。
06:01
好,这个呢,就是我们完整的读流程,在读流程里面啊,底下呢,也有对应的一个说法的一个记录啊,创建table对象,发送get请求,然后优先访问读缓存,查找是否之前读取过读并且呢,可以读取里面的所有信息和布隆过滤器,布隆过滤器呢能够判断,简简单的判断。这个文件里面有没有,你想要找到那个ROK啊,如果他不能过去说没有,这个哈希有一个特点对不对,他说没有,一定没有,他说有不一定有,对吧,哈希同装是有不一定有,但是没有的话一定没有,对吧,我们没有的话呢,不找哎,你也可以扫检索一些文件啊,这个不管读卡存里面是否已经有数据,因为这个数据可能是过期的,都需要再次读取,写缓存和store中的文件啊,都需要去对踪文件,然后呢,最终合并所有读取的文件,文件按照get的要求返回就可以了,他需要几个版本,你最终保留几个版本给到他就可以了啊,那这个呢,就是我们的完整的。
07:00
读流程啊,可以看到跟写流程相比啊,它可能更耗性能一点,涉及到大量的一个磁盘的一个读写啊。
我来说两句