00:01
好,当我们了解了全部的读流程之后呢,最后我们再着重的讲一下合并这些读取数据的一些优化手段,呃,我们每次读取数据呢,都需要读取三个位置啊,最终呢,实现一个版本的合并,它的效率呢会非常的低,所用低的点呢,就在读取那个HDL磁盘文件上了啊可能有的同学会说啊,老师如果你只读一个版本的话,那你直接读写缓存里面的,它不就是最新的吗?你不就不用读别的了吗?啊不是这样的啊,不是这样的,你读写缓存里面它那个TS时间戳,也就对那个版本号,其实啊是我们可以手动添加的,哎,你想一下,有没有可能很早之前有一个人在我们的磁盘里面写了一条数据,他那个时间上直接写了一个99999999,会不会有可能是有可能的吧,对吧,所以你为了这个准确性啊,你是不可能说只读一个版本,你就只要几缓存的。不管任何的条件下啊,你怎么样去读它一定是读这三个位置的一个文件的啊,一定是读三个文件,所以我们啊系统呢,要对此进行一个复杂的一个优化,它着重优化的手段呢,就是读缓存,就那个block catch读缓存和磁盘文件的一个对应啊这个怎么优化呢?首先带有索引,这个我们相信不需要做过多的介绍了啊,我们在读文件的时候,有索引没索引,那速度差太多了,对吧?并且还有一点很重要。
01:24
我们h fair里面的这个文件啊,它都是有序的。按照RK是有序的,所以你读的时候相对会快很多啊,相对会快很多,它是按照RK有序,而我们读数据一定是按照RK去读的啊,我们h base读数据只能按照RO去读,所以相对呢,本身就是挺快的。第2.block开启里面会缓存之前读取的内容和原数据信息,如果这个文件没有发生变化,不需要你再次读取,直接拿之前的就可以了,它每次都会对一下嘛,你读到读管存里面的数据之后,它不会直接拿来用,它会去对一下,看有没有发生变化,没变化直接用,有变化更新一下啊,有变化就更新一下。第三个就是我们的布隆过滤器啊,啊,就是我们的布隆过滤器,布隆过滤器呢,使用的是哈希的一个算法,每次由数据写入的时候,比方说1001写入,他把1001走一个哈希,走完哈希之后不是得到一个int值吗?
02:19
哎,把这个int值的大小放到我们布隆过系,就是一个很大的一个地图,放到对应的那个地图的位置上,把它标记为一啊,布洛过滤器刚开始初始化的时候呢,是全部为零的啊,全部为零的布隆过滤器有一个特点啊,它非常的长。对吧,哎,非常的长啊,这个特点呢,大家还是挺喜欢的啊,非常的长,它有多长呢?哎,一般来讲它能有10亿。各长度。啊,11个长哎,你不要看它11个长度会觉得它很占内存啊,其实并不是这样的,当然我们h base里面用不了这么长啊,在别的地方如果用到布鲁波器,它很有可能能达到11个长度啊,不要觉得11个长度呢会占用很多内存,因为它一个长度只占一个小B。
03:08
啊,一个小也就是一位啊一位,那你可以来数一下11个长度呢,大概占到位数的话,占多少兆啊12341234。对不对,11个长度,首先它要除以八,得到那个大B,对不对,咱们这个除八呀,哎,就假设它近似除以一个十,相当于去掉一个零嘛。对吧,好,这是去掉一个零,然后呢,三位为K对不对,在三位为兆对吧,所以呢,它大概是100多兆。看到没有,11个长度只占到100多兆,而这100多兆呢,可以存到磁盘里面啊,可以存到磁盘里面,11个长度只占100多兆,那我们HS里面呢,使用的要稍微小那么一点点,因为它需要存到内存里面,对不对,它能有个,哎千万位长度或者百万位长度,或者亿位的长度,我感觉呢,都是可以的啊,都是差不多的,对吧,它会自动的根据你文件里面数据的多少呢,进行一个设计啊进行一个设计,那这个算法呢,其实也非常简单,走一个哈希,走完哈希之后,比方说你1001这个UK,它是一个字符串,对不对,走完哈希之后得到的值是100万,那怎么办呢?哎,反正。
04:16
反正这个波动位系够长,我在100万的这个位置上给它画一个一就可以了,重新初始化的时候呢,这全都是零,对不对,这是第零位,这是第100万位个长度吧,在这边画一个一就可以了啊,画个一就可以了,那这样的话呢,就能标记这个对应哈希值的啊,这个ROOK啊,在这个文件里面啊,可能已经存在了啊,如果你有两个ROK,比方说我们刚才说的1001和8008,它的哈希值呢,都是100万,那没有办法,这就哈希碰撞了啊,哈希碰撞了波能过滤器,我们在使用的时候,你要允许它出现碰撞,它碰撞的几率呢,跟你的长度有关,那你越长嘛,你就越好。越长越好,它就越不容易碰撞,越短呢,它就越容易碰撞,当然你也可以走多个哈希算法,对吧。
05:05
反正你足够长嘛,你要是有1亿个长度的话呢,3000万给一个哈希算码,3000万给另一个哈算,3000万再给一个哈希算吧,你同时啊,一个1001走三套不同的哈希,三套不同的哈希呢,在对应的从零开始数到这个位置上呢,写三个一,用这三个一来表示这一个,OK,那它就不容易碰撞一点啊,这具体的情况呢,看你啊,看你怎么去进行一个操作啊,都是可以的,那我们这里呢,是能够使用不容过滤器的啊,因为它即使不准确,对读取数据呢,结果是没有影响的。啊,他不会出现错,呃,他不会出现这个,呃有但是没有读的情况,因为如果有的话,他一定是会标记那个一的啊,如果啊啊哈说没有的话,那绝对是没有的,哈希出错的点在于他认为有,实际上没有,但这个会不会到结果到影响到不会,这里面没有我们想要的UK1001,但是我们以为他有去读了,会不会造成影响,不会对不对,你只不过是读了白浪费时间,读完之后呢,发现没有吗?
06:08
对吧?啊,所以这里呢,不容关系也是一个很大的优化,如果这个文件里面就没有我们想要的rie的话,我们可以去不去读它就可以了啊好,那这是我们合取数据的时候啊,进行的一些优化手段,这个还是非常重要的,因为读啊,相对应在HP里面就会变慢啊,因为它写的时候是追加写嘛,在文件里面一直追加,咔咔咔一直写啊,那读的时候呢,你要读多个版本,那就比较费劲了啊。
我来说两句