00:00
好,我们来看一下这个R的设计,你要注意的就是rie的设计啊,跟这个一分区这两个东西啊,它是分不开的。它是分不开的,为什么说它分不开呢?来看一下,就一条数据的唯一标识是UK,这个大家都知道了,对吧,而且一张表里边呢,就是唯一性啊,其实收集UK的时候有一个唯一性原则,OK,它指的是什么意思呢?为什么说这两个东西分不开呢?你看啊,刚才我们是。这是一分期的一个表吧,你说一条数据过来了之后,他往哪个哪个里边放呢。轮吗是吧,他就按照R。来的,它怎么来呢?它同样的拿着UK啊,跟这个什么分区键安位比较,它首先这样,你这个地方不是负无穷吗?最小,因为它没有对吧,没有就是最小的,你要注意没有就最小的,然后假如说我有一条数据是abcd啊,它的一个。Rookie是abcd,那后面纸我就不管了,对吧?哎,看rookie,那这个东西放在哪呢。
01:06
这个这个东西放哪个区里边。是不是在这啊,在这它怎么来放到这儿呢?是这样的,他拿abcd啊,一个A啊,它跟这个东西比较。这个没有吧,没有就为最小啊,任何有数据比没有数据都大啊,那没有它就小,那它就是往这个大K后面放。然后呢,它跟这个比A跟A比就干什么相同了,比第二位,然后这个B比A大了,它就往这个后面放。往这个后面放,那也就是说它要进到这个区了,它不可能不可能落在这个区了,因为它比你最大的这个结尾拦截的一个地方都要大,对吧,所以说它要往后跑,他接下来是不是跟这个BBBB比啊。对吧,它一比A比B。小,然后他就往这个前面放,然后这个后面,这个前面它就落在这了。他就落在这个里面,是这样来比较的。
02:00
这样来比较的OK好。那这两个东西首先是比较上它俩的关系吧,就是说你的一个肉一条数据来了,它落到哪个区里边,哎,跟这个分区线有关,第二我们这间缩小的你这个预分区是为了干什么。是不是为了做负载均衡啊?对吧,你不是说他自己切分,它有可能产生那个数据倾斜嘛,所以说自己切分嘛,自己切分就是为了做这个负载均衡,对吧?OK,那负载均衡怎么做呢?跟刚才所说的,那你说K过来了之后。是不是要跟这个因为分区线比较,那你想想看,如果说你一个分区线建立的不合理,它所有的数据就是你的R设计出来啊,再加上你的这个分数线设计之后,它所有的数据全部都在这儿,有这种可能吧,你你设计的不合理的话。对吧,你设计的不合理的话,你这个地方来一个什么竖线啊,全都是竖线分割,竖线它的一个值,它码值是非常大的,应该应该不是最大,就是倒数第二档非常大的,如果说你这个地方全它竖线在这分割,那你想想你这个rie怎么设计,它是不是都会落到这,就是你后面这些东西都没有用了是啥。
03:17
就你这些区都不可能进数据了,能能懂这个意思吗?就是就算进出去也相对来说比较少,就比这个键还大了吧。比这个东西还大了,就比较少啊,就做了一个什么,你虽然做了预分区,但是他也没有负载均衡,那你是这一个区会一直膨胀嘛,其他的脑子相对来说数据量比较小。啊,数量比较小,所以说在你设计时K以及A分区键的时候,你就要考虑你的数据。啊,你的数据啊,怎么来做到它的一个负载均衡的问题,负载均衡的问题,OK是这样的。一般它是有设计原则,设计原则是什么呢?就是第一要唯一性嘛,第二散裂。
04:03
啊,那散裂指的是什么意思呢?就是你很多条数据,你要相对来说均匀的,不是说绝对平均吧,就相对来说均匀的。放在这个里边,假如说这个有500条,这个600条,说这个什么450条,这个什么700条这种还可以啊,这个就是挺均匀的,不是说你这个500必须其他的都500,不是这样,不是说完全平均啊,相对来说均衡一点,不是说这个里边上了5000万了,或者说5000吧,然后这个里边还有两条数据呢,这就不合理了。啊,这个你就设计的不合理了啊,你要注意这个问题,那它是怎么来的呢。又要。唯一性,那就是长度呗,对吧,它有一个长度最大,官方文档给他最大是多大。6K能能到多大,64K吧,哎,它能到64K,但是呢,通常的工作应用呢,都是。
05:00
70~100的字典,也就是说你那个RK的位数啊,70~100倍就差不多了啊,就差不多了就够了,而且rie设计你这个长度就能保证它这个唯一性嘛,那里面放什么东西呢。放什么东西是不是决定了你会放到不同的区里边啊,对吧,啊不同的区里边OK,那这样其实它是这样来的,怎么来呢?RK啊,首先你要放一个什么时间戳,然后时间说比较唯一嘛,然后放一些相对来说常用的。吃饭。那里面不是H贝斯不有放很多很多分列吗?音符里啊有很多很多列对吧。你把相对来说常用的字段也放在里边,那为什么你取数据的时候,到时候你针对于常用数据做计算的时候,你直接拿UK就行了,对不对。来看一下为什么这个地方能省很多事呢?还记得当时的获取数据吗?
06:01
获取数据,你这个地方要拿具体数据,你是不是对三形便利。但是你要拿出呢。是不是result里边就有。当然还有一象吗?我们当时提到一个result,就是一个keep吧,对一对应环境吧。啊,所以说这个地方你要把常用的东西要放进去,常用的字段放进去,到时候你就不用做这个解析了,比较麻烦,直接拿出一切分就有数据了。这个数据了,这是第一个,还有一个时间段要拼进去吧,因为保证它那个微信微信那这个散裂我们怎么做呢。对吧,刚才解决的是你这个什么数据啊,是不是拿数据方面就是为了业务方面啊,但是你没有解决这个反面问题嘛。没有解决吧,那散面怎么做是这样的,每一条数据呢,你给他这样,假如说没有后续的业务影响。你把这这不是分区键吗。对吧,你把分支线拿过来,你们肯定知道分支线嘛,你把分界线拿过来干什么呢?在rookie。
07:02
设计的时候,你把这个分数线。拼接上去。就是说你这后面是时间戳TS,然后具体的什么列什么列CN,然后变成一个CN,就是具体的CN加值对吧,就这些东西具体的值Y6啊,但在这个如果说你单纯的放这个地方,它不够散列吧,你想想看,你是根据时间戳来的,你时间戳年月日这个东西前面的数据都一样吗。同一天所插入的数据是不是前面年月日都一样啊?不够散裂,那怎么才让它散裂呢?自己随机的拼一个这个东西进去。想一下就是你整个的一个R啊,就是这样的,来的是分区键。在前面,然后下划线,再加一个什么时间戳,再拼接上你各个字段的值,整个的分区线,来这样设计,来这样设计,那你想想看,这个分区线刚才我们讲的是怎么添加上去的。
08:03
随机添加吧,对吧,而且这个分界线是不是这个地方的东西。那你随机添加的,到时候这条数据是不是相对来说会随机的分配到不同的锥里边啊。这就是做它的一个散面。啊,做它的一个散列,就是说它前面添加的这个东西啊,一定要跟分区键有关,这跟分界线有关,而且工作当中也是这样。一般是这样,你看啊,这个分区线叫什么ABB,这其实不够均匀。不够证明怎么来呢?你这不是分成了?五个区嘛,对吧,他这样他是拿着你的值了。直接你不是五吗?你编译一下,生成那个0001020304。生成这个东西,生成这个东西作为它的一个分居键。啊,分区线你不是五个数定吗?五个readingd你能拿到了,OK,然后再拼接一个竖杠。
09:03
啊,为什么拼接竖杠,因为竖杠相对来说,刚才提到了它的一个阿斯玛值很大。很大,那你想想看,这个分区键是不是为了男数据用的呀。对吧,那你想看,OK,那零零,如果说你后面一条UK是按零零下划线分的,是不是就在这个零零这个区里边,如果它是按零一下划线分的,就是零零到零一这个区里边吧,就做这个事,做这个事,OK,那这个如K里边这个0001是跟这个来的吧,那这个东西0001是怎么得到的呢?是这样。你把里里边的值啊。你不是有很多值吗?你把它拿出一点过来。拿出一点,取一部分,然后模拟五。魔影舞。挪一五之后是不是能得到零一到零四,这没有问题吧,接下来就是前面这个东西,他拿什么磨呢?是这样。
10:00
拿一些什么随机数,然后你Y6的哈希等等这些东西。下为什么又要做这些什么?哈希啊,是为了将它的一个数据散裂吗?对吧?是为了将它一个散裂。整个的逻辑有没有听听懂。再来一遍是吧,首先第一一分区间呢,有很多种设计方式,对吧,你用的a abbb都可以,但是常用的呢,是按照你个数来,然后分成零一竖杠,零二竖杠,零三竖杠。就是乙是分成几个区,就是000,一直到零几啊,这是一分之间,那最终形成的这个东西就是。这个地方就0000到零一对吧,啊零一到零二,这后面就不写了,然后呢,我们一般会在这个分区线后面加一个竖杠。因为竖杠的值比较大,那分区线它就为了拦数据用的,对不对,它比较大呢,它比较到这个时候,它就能准确的把它拦下来。它就能准确的拿下来做这个试用的好,分区键设计好了,接下来是扔rie的设计了,哎,RK设计也讲了,它整个的呢,你要什么时间戳,加上Y6这些东西都是正常的,常规的啊,你要保证它唯一嘛,对吧,把这些都拼接起来,它肯定是唯一的,OK,接下来我们之前提过,你要想数据放到这个。
11:21
均匀的散裂到这里边,你是不是随机的添加一个。这个东西比较闪电。对吧,你是不是随机的来添加这个东西。那我们采用的是什么样的学习方式呢?你直接你用一个read的一个方法来调到这里边来会取这里面值,OK,没有问题,它相对来说很平均,很平均,但是你取数据的时候就麻烦了。你随机生成的一个RK,你取出这个star k k能写吗?你随机的,你整个的这个东西是一个rie吧,你前面这个010203是随机拼进的,对吧,用那种方式。Re,这种方式是可以达到相对来说均匀的,做这个负载均衡是可以的,但是呢,取数据不方便,能不能想明白?
12:09
这个东西能想明白吧,因为你在插入数据的注册数据的时候,随机生成的这个前面0102,所以你取数据的时候,你不知道吗?你怎么知道前面这条数据前面是什么呢。所以我们不用这种方式,我们用什么方式呢?哎,我们写一个方法,这个方法呢,取这里面某些字段的值,然后点什么哈希点MD5,将它进行一个散裂,然后模一补。V5拼接到前面V5之后,它肯定出来的值是0234对不对对吧,然后你把这个东西啊,把000就变成001呢,变成010203,然后拼接一个下划线,因为下划线肯定比这个竖杠小,它就能起一个拦截的作用。篮球,OK,那这个地方是破的了。你取一个什么直哈希,什么MD5也是做散列吧,跟刚才那个方法是不是一样的,需求是一样的吧,第二他拿数据,那拿数据的时候,你是不是知道你拿什么东西来哈希来MD5的呀。
13:07
你在拿出去写这个r key的时候,你是不是再把那个方法调用一次,把这个东西给拼起来呀。随机的方式拿不到,那你自己按照自己的方法来生成的,你能不能拿到。能吗?哎,这样既解决了一个散电问题,又二一个,又解决了什么,你在后期要取数据的问题。就没有那么困难了,能不能想明白这啊,除以五是五个嘛,我0234嘛,五是我举的一个例子,不是说公司当中都是除以五嘛,因为我是五个五个瑞嘛,我要将这个数据放到五个reading里面,所以我用五嘛,对吧?哎,这个五是这样来的。啊,你要想明白这个问题,就是说你这个地方啊,本来是随机的一个01020300405,就拼接一个分区建进去,但是呢,真正的用专的那个方式啊,你拿数据的时候就拿不到了,你就很痛苦了,你就根本不知道这条数据,假如说我要拿什么那个什么1001,那个学生的成绩为50的那种东西,你本来定位RK啊,你就get上说传入K进去,此时RK没法传了,因为你当时C数据的时候,这个是随机生成的,你你再调一一遍随机方法。
14:20
你能保证每次都一样吗?不可能吧,大部分时候还是不一样的吧,所以说这拿的数据就有问题了,所以呢,我们就用自己再去写一个方法。写一个方法,拿这里面的值,而不是说拿直接拿这里面值去。模拟五,我们为了散裂的考虑呢,把这个纸拿出来啊,做一个哈希,做一个什么MD5随便啊,这些东西你随便。那这样就既达到了散裂,第二个你后期取数据的时候也能方便了啊,也能方便了,总体是这样的,所以说整个的设计啊。Rookie和这个预分区是分不开的,他们俩是密切关联的,密切关联的,这你要注意的。
15:02
啊,注意到,然后还有几个原则呢,就是一个微信还有一个长度原则,还有一个就是散列啊三大原则,这个是比较爱问的,就是第一个笔试题当中就是这三个原则,第二个面试题当中呢,那课上就不好讲了,因为他跟实际的需求,每个工作需求不一样,他是面对面,你俩聊的时候,他说我现在有一个有个什么需求来,你帮我设计一下R。啊,现场的需求,那你要考虑到这些情况嘛,啊这些原则要考虑进去,要考虑进去的。然后至于这个散列,什么字符串反转,字符串拼接,都是为了做什么散列啊,啊做散列做它这个唯一性的啊,做它这个唯一性的是这样的,真正的业务需求当中呢,其实比刚才讲的还要难,难在哪呢?取数据,取数据你不是start key stop key吗?按这种方式对吧。好,如果说你想取得数据分在两个区里边,那就比较麻烦了。
16:00
所以说真正的需求啊,挺矛盾的,你要在保证散片的同时,还要保证它那个集中性。又要散裂,又要集中这两个矛盾的点,对吧,要考虑举个例子啊,你们后面要讲那个电信项目,因为这个猪P啊,抛开业务需求没法讲通讲的意思OK,后面这些需求呢,是这样的,他让你做这个什么事呢,统计。每年电信需求对吧,电话号某个人某个人,这个某个人呢,指的是一个电话号才能理解吧,OK,他要统计什么呢?统计某个人。每年。每月。每天的一个通话记录。通话记录包括什么呢?通话时长跟通话次数?通话次数是这样的啊,这个需求能听明白吧,通话时长跟通话次数对吧,肯定这两个东西就是通话记录啊,它的数据呢,是一条一条的日志对吧,因为后台产生一条日志,它里边有呢,通话时长,那通话次数一条日志就通话一四版对吧,是做这个事情的,OK,它这个时P怎么来呢?首先那个预分均键还是这样,0102030405,这个没有问题。
17:11
啊,还是这样设计,因为我们只需要模拟五个就能拿到一二三四五十吧,啊这个没问题,然后接下来你要考虑需求,他要每年每月每日这个人的一个通话记录。这个人的通话记录,OK,那你想呢,是不是最好把?这个人的一年的数据,你开始想一年的数据是不是放在一个飞机里边。因为你取的时候。你这个地方start case到可以写的时候,你如果跨reading数据就拿的很多,能懂这个意思吗?所以说你最好在写这个start key stop key的时候,将同一类的一个数据啊,放在一个椎间里边,就要考虑它的一个集中性,那指的是什么意思呢?如果说我把一年同一个人啊,前提是同一个人一年的数据放到一个培训里边。
18:05
放在一个约定里面,然后你去取数,去的时候是不是只要在一个瑞里面取就够了。对吧,啊,这不用跨两个re,但是呢,这个时候你会发现数据过于集中了,对不对。一个人一年的数据都放在一个微镜里边啊,数据过于集中了,那这个时候你再把维度放小一点,我把一个月的数据放在一个微信里面可不可以?我把一个月的数据放在一个月里面,那我取单独的,如果说我要查12月份数据,我同样的还是在一个月里面获取数据就可以了吧。那获取年的时候呢,你要写12个大为对不对,对吧,因为它的分散在,因为我们当前是五个五个reading,你可能写五个就够了,但公司的需求当中可能不一定超过12吧,你是不是要写12个。那有同学说了,我再闪现一点,我把一天的数据放在一个里边。
19:01
就是考虑到贴那这块需求,你你太过于散裂,那你算算算月份的数据的时候,你是不是要写31个或者30个sa跟so。啊,还要考虑平年闰年这种情况是吧?啊就比较麻烦对吧?啊,所以说最终定位既要你想想看,整个的你散裂不能太散裂了吧,把每一天的是够惨烈了,很数据能够均匀的分散到不同的微里面,但你取出去就麻烦了吧,你一个月的30个,你说忍一忍行了吧,一年的呢。365个写死了对吧,写死了,所以说呢,定位到月,这种定位到月就是我们为了干什么,将数据做集中对吧。数据做集中,做集中处理的,那怎么来实现这个把一个月的数据放在一个瑞里面呢?看一下,那我刚才不是说了,你在UK前面不要拼接一个什么零一_零二下划线吗?这个不是模引五来的吗?那我拿什么值模拟呢?你看啊,我拿出手机号可以吧,然后再拼接上一个年月。
20:07
把年月都转成int对吧,转成int,然后把这个什么。硅块进行一个哈希。然后再磨一磨,你想想看,这个地方是什么标号,这个地方是年月。那你同一个人同一年同一月的把电话磨出来的值。如果说。138什么什么数据,然后说在2018年七月份。打的数据只要有一条是零一,是不是所有的七月份的数据都是零一,这有没有问题?想一想啊,是不是你只要是电话号相同,你月相同,你模拟五出来的值,因为你这个哈希算法是你自己写的一个算一个方法吗?你按这个方法算出来值是不是都是一样的啊,你只要这个值一样的,你是不是所有138这个人在七月份所导的数据都会在这个联里边。
21:01
对吧,这个就保证了它的一个集中,而且是你这个哈希是不是为了散电啊,将这个人不同的月份放到不同的一个V0里边吧,因为你这个零七是零一,你改成零八有可能它是零一有可能,但是更大的可能性是002030405啊其他的吧。是不是?为了出现02030405,是是为了它那个散列啊,对吧,但是我们将这个电话号加这个年月的飞块呢,是不是为了又是集中啊,哎,将它同一年的同一月的一个数据啊,集中到一个日志里边啊,所以说rie的一个设计啊,还是挺复杂的,而且是完全是跟着业务走的。根据业务走的,如果说不根据业务走,你直接随便拿一个值出来哈叽一下摸一捂就OK了,你因为你在没有什么业务需求啊,对吧,因为你不考虑获取数据啊,不考虑获取数据的一个方便性啊,你只考虑电吧啊,你不用考虑它一个集中性啊,所以说真正的去做这个需求的时候,集中跟散电啊,都多少虑个点,多考虑个点OK。
我来说两句