00:00
那么接下来就是我们这么多个索引怎么来选择呢?或者说什么样的场景更适合什么样的索引这个,那么下面给到大家的是官方的一个资料啊,这个描述也好,这个动图也好,都是官方做的,那我们一起来看一下,第一个场景是对事实表的延迟更新,什么意思呢?呃,熟悉数仓建模理论呢,我们都知道,我们通常去构建一些事实表,还有维度表。对吧,那对应呢,我们会去构造各种模型,像什么新型模型,雪花模型,星座模型,这是基于维度建模理论,总而言之呢,我们通常在数仓里面都会有一个事实表和维度表,那事实表其实就是对应我们的业务过程。那比如说你如果你是电商场景,那你应该就有大量的交易,比如说订单的数据,支付的数据啊,还有比如说像什么加购物车的数据,这种都是属于咱们的事实数据,那这些呢。
01:00
我们通常首先会在数据库当中存储大量的这些事实的交易数据,对吧?那除了电商场景还有其他的,像共享出行的什么行程表,股票买卖记录表啊,这都是不同业务场景下的一些事实表啊,电商的订单表,呃,那事实表有个特点就是什么呢?啊,随着你的业务在不断的。就用户在使用啊,不断的操作,不断的去执行一些业务过程,那么你事实表的数据应该是一直在不断的增长,就比如说订单好了,你每天都有人下单,那你这个订单的数据应该是越来越大,越来越大啊,另外呢,这些事实数据还可能发生什么呢?更新。更新,而且更新的话,我们还要考虑一个事情,它更新的数据大概呢,是很久以前的还是说最近的呢?那么大家可以想一想,比如说电商的订单表就好了。一笔订单的状态要发生改变。
02:01
对吧,比如说咱们退单了,或者从下单变为支付状态。啊,或者再再到最后的,呃,签收状态等等,这些看你业务怎么定义啊,呃,这些是不是针对于最近的这些订单才有可能啊,比如说你去间隔了一个月以上,那么你这个订单的信息是不是基本上不会再变了,因为从业务上来讲,商家也不会再允许你超过一个月再去说做一些退单,或者说我下完单一个月不不付款,一个月后再付款,这种应该是不会出现,对吧。所以这种更新事实数据的更新应该是发生在什么较新的记录上,也就是说它的更新数据分布是有特点的啊,都是最近的。那么对于比较老的一些数据,呃,它的更新就比较少了啊,因为这笔订单,这笔交易早就关闭了啊,不会再变更了啊,总而言之呢,就这种场景,大部分的更新会发生在最新的几个时间分区上,而小部分呢,在旧的分区啊,那这个是官方画的一个图啊,这是一个数据库啊,No no circle的存储也可以啊,那么这边呢,是根据什么分区呢?你看订单创建日期,比如说咱们到啊年月日这样子。
03:23
好。那更多的是在什么?最近的这一段时间,那更早之前的这些数据,基本上很少做一个变更,好了,对于这样的这种场景,我们适合用什么布龙索引?因为布隆,所以它可以帮我们去裁剪,因为它里面可以比如说范围裁剪,我举个举个例子啊,它可以通过m max对吧?啊,我取一个最小最小最大区间啊,命中了,那就在这个区间里面找就好了,对吧,我把小于最小的大于最大的直接就裁剪掉了,好,就简单举个例子啊,那布隆过滤天生就是用来判断,呃,用来判断在与不在是吧,非常高效。那如果我们生成的这个key,也就是我们回头指定生成了这个record key啊,大家注意,咱们反复聊到key建这个概念就是指的record key啊,可以某种顺序排列,也就是说它是有序的。
04:25
那这样的话,他们就能够更多的去筛选,尽可能的筛选出来啊。就将不必要那些更多的就过滤掉了。那这样性能就更高了啊,那湖底会用所有文件的建域来构造区间数,建域就是建的范围,建的范围叭,如说从哪到哪啊,建于啊,构造一个区间数,这样能够更高效啊,总而言之言的,总之这一段话就是什么呢?适合用布隆,布隆可以做一个呃,区间裁剪啊,更高效。
05:04
那如果我们为了更加高效的使用布隆过滤器进行一个比对的话,呃。这边护体缓存了什么输入记录,也就是说做了什么事的缓存,并且使用了自定义分区器和统计规律来解决什么数据的倾斜啊偏斜。有时候你看这边说布隆过滤器的伪证率,其实就是什么常说的假阳性率啊,过高会增加数据的打乱操作,那这个时候呢,也就是说如果假阳性率特别高的话,为什么假阳性率会高啊,啊大家应该知道布隆它的准确率或者说误差率是不是,呃,通过一个公式可以算出来,那这个公式是不是跟很多。呃,因数有关系,第一数据集的大小,也就是说你整个数据量有多少,第二一个可能你给到了这个bit map空间有多少,还有呢,你这个系数,还有哈希函数的个数啊等等,这些都有关系,那么呃,其中一点就是数据量。
06:10
对吧,啊,数据量越大。那么你这个假阳性率的可能性是不是就越大,那个公式忘了,自己可以去研究一下啊,那这个时候我们就希望呃,布隆过滤器的一些参数啊,一些一些变量能够动态的调整可以啊,我们只需要什么设置这个参数就可以了,你看啊忽底布隆。首先指定为布隆索引的过滤类型,指定为动态的就可以啊,指定为动态,它可以根据咱们总的数据量来调整布隆相关的一些参数,而从而达到我们希望的那个假阳性率啊。这叫假阳性会更好理解啊,这能理解吧?啊,或者既然说到这儿,我就简单给大家看一眼吧,呃,因为有的人可能还不太熟啊,不太熟啊,比如说布隆,你搜一下过滤器。
07:08
呃,我看一下有没有原理的介绍啊,看一下十分钟理解啊,随便找一篇啊,我只想找到它的公式原理我就不讲了啊,原理不讲了。这篇没有给我们那个数学公式啊。随便点啊。呃,这个也算吧,但我想找一篇更全的。哎,你看啊,呃,那我们看也就是说跟公式有关系啊。嗯,看这一篇。
08:01
诶,详解布隆过滤器的原理,使用场景,注意事项,我看一下这个。好,那我们看一下啊,也就是说这些公式大家自己看一看就行了,它有我们的数据量啊,其中一个参数数据量,一个是K值,一个是M值,一个是bit map的大小。这些。能够计算出一个一个它的阳性率啊,或者说准确率,或者也可以算为什么误报率。好,这块我们就不再展开了啊,这是第二第一个场景事实表啊,总结起来是什么事时表这种场景呃,更新主要集中在最近的日期,那么我们用布隆就可以了。好,第二种场景是对于事实事件表的去虫,大家注意是事件啊,不是事实事件是什么呢?比如说前端买点产生的这些,呃,事件流,比如说呃点击流,用户的点击买点产生的数据,还有咱们物联网,比如说车联网一些传感器产生的这个数据啊,我们通常称为事件流嘛,对吧,还有广告点击这些啊,广告曝光好。
09:17
那么这些呢?我们通常会将这个数据先采集进卡不卡对吧这种消息队列。那么而且这种的数据量一般呢,是咱们业务数据库当中,呃,十到100倍,也就是说事件事件的数据往往是大于事实的数据,对吧,也就是说数据库里的数据跟我买点产生的数据哪个更多呢?一般来讲是买点还有传感器产生的这种啊,会更多一点,而且它有一个特点,它要不要更新呢?这种事件的数据一般而言都是追加啊,不存在更新,大部分而言啊。那即使有。
10:00
更新那可能也是最近的几个。那这个时候呃,涉及到一个数据重放啊,可能是一个采集的一致性这些问题,可能有一个重复的问题,那这个时候去重也是一个很常见的一个需求吧,对吧,这个大家做过的话应该都很熟悉啊,不管你是什么业务场景,那接下来呢,就是咱们对于这个,呃,你想要低消耗的对大数据量进行去重,这个还说还是比较有难度的啊,要么你就是挺浪费资源。那其实如果咱们可以用间值存储来实现驱虫啊,或者说这个量比,说白了就一句话,量比较大怎么办?那可以,如果你对h base比较熟悉,并且呢,你们公司当中,你们环境当中有人可以维护运维这个h base,并且能调的用的比较好,那你可以考虑一下用h base啊,因为它在呃底层的h base索引当中,它不是简单的将索引数据就存进去了,它也利用了H且base像RSM这种特性啊,做了很多很多的一个处理跟优化啊。
11:10
但是呢,这个事件数据还是不断膨胀的,一直在膨胀,那即使你代价也是比较大,不是说不行,是代价比较大。呃,但这种时候呢,有范围裁剪功能的布隆,所以才是比较好的,因为可以裁剪过滤啊。那这个时候我们这个可以怎么做呢。可以用事件时间加上呃,标记这一条事件的一个VID来组成这个键就好了,那这样有什么特点,你看这个时间戳它是不是一个递增呢。对吧,那这样的话就是一直在增长的一个单调递增的一个键啊。好,总而言之呢,如果是这种布隆也更合适啊,那么我们大家看完两个场景都发现诶,布隆更合适啊,所以其实布隆就是默认的,默认就是用了布隆啊,那么对维度表的随机更新和删除,什么叫维度表啊,像什么地区啊,时间呢啊,渠道啊。
12:15
对吧。这些就是我们所谓的维度,比如说你电商场景是不是还有呃,商品维度对吧,是几是哪一个品类的。啊,等等这些啊。包括什么用户维度表对吧?记录了用户信息的这些表啊,用户维度信息啊,也就是说你在建模的时候,肯定要去构建一些维度表,那维度表有个特点啊,它的更新和删除,我举个例子,一张用户表啊,比如说你有张用户表,呃,有123有三名用户啊,用户一是去年创建的啊,注册的啊,用户二是今年上半年注册的,用户三是现在注册的,那这个时候呢啊,很久以前注册的一他有没有可能更改信息啊,很有可能吧,他可以更改他的,呃绑定邮箱,更改他的绑定手机号,可以更改昵称,可以更改地址。
13:08
是不是都可以改对吧,也就是说你并不是说你的更新都集中在最近这一段时间,而是。不一定啊,所以我们叫随机啊,随机好,那这种场景的话,你用来去裁剪就不合适了,因为比如说我有这么一个,呃。这么一个范围吧,我这个表示时间顺序,好吧,表示时间顺序,如果你是裁剪的话,应该是什么呢?啊,筛选出一段。那在这一段里边再去匹配,这样效率高,那我现在维度表这种场景是,哎,我指不定在我不会集中在某一段进行那个更新和删除,我可能在这里,可能在这里,那你就没法帮我提前裁剪掉,那这样的话,你用布隆的话就不能够得到一个很好的效应啊,就性能可能就啊没有发挥不出来了。
14:02
也就是说真的是随机写入,那我们的更新操作会触及表里大多数文件,大多数分区,对吧?啊,这时候布布隆就不太好使啊,即使使用了范围比较,也还是检查所有文件啊,那这种场景怎么办呢?呃,简单来讲,既然是。可能所有文件都可能涉及到,那你就简单索引就好了啊,就不要做啊,不要做那些花里胡哨的招了啊,不要给自己搬起石头砸自己的脚啊,没必要啊,他不因为呢简单,所以他不会提前裁剪,不提前裁剪,而直接是将所有文件跟所需字段连接啊,就是Joy嘛,我们前面聊聊过嘛,对吧。呃,但是这种场景你也可以考虑base。啊,因为是你只要是对h base能够拿得下,能hold得住,那样h base也是可以的,H base对于这种随机读写本来也是很擅长的,是不是好了,另外呢,有一个小事情啊,小事情就是什么呢?呃,我们用全局索引的是时候啊,有可能涉及到分区路径需要更新啊,你可能不好理解对吧?呃,如果你是按照年月日这种日期来作为分区字段,那一般这个分区产生就不会变。
15:24
是吧,比如说你是2022年9月1号这个分区,那基本上这个分区值就不会变了,但是如果你用的不是日期呢?啊举个例子啊,如果你是按照城市来分区的一张用户表。对吧,比如说诶,北京这个城市是一个分区,深圳是一个分区,对吧,那北京比如说有用户ABC啊,深圳这个分区里面有用户D的信息啊,你是这么来做了,对吧,那就有可能出现什么呢?用户A。他离开了北京,他去了深圳,那这个时候。
16:03
是不是?对于A这条数据来讲,它的分区值是不是变了,它的分区信息是不是变了。对吧。那这个怎么办呢?这个时候咱们可以开启这个参数,这叫什么呢?分区路径怎么样呢?更新把它置为true就行了,那分下面还有一个参数,那其实这两个分别对应的一个是用了布隆,另外一个用的是简单索引啊,你用了什么索引,你就设置哪个参数啊。那这个时候用Mo的表会更好啊,当然这个表后面再来聊啊,下面就会聊到啊,这是一个小事情啊,就是分区路径会更新的这种特殊场景啊,可以开启参数。好了。综上所述啊啊,我们简单聊下来就是什么呢?大部分场景事实表,事件表,事件流都可以用布隆就好了,另外呢,如果h base hold得住,那就用h base。
17:03
第呃第二点呢,如果是随机的更新这种场景,那就是用简单索引啊,或者用h base。好了,这都是一个取舍,没有说谁绝对好谁绝对差啊,也就是说更新频率,更新的范围比较集中,用布隆更更好啊,更新比较分散,那就用简单索引或去base好了,就这样子。
我来说两句