00:00
好,上节课我们提到了分区有很多的好处,那既然它这么有用,那接下来呢,我们就来详细的研究一下这个分区策略。那大家思考一下哈,我们在前边写代码的时候,有没有去设置对应的数据的分区呢?是不是没有去指定啊,那没有指定,那它一定有默认的分区规则,是这样吧,确实啊,那么这个卡法呢,它默认的分区规则呢,是采用的这叫default partitioner,那我们就来看一下这个default partitioner。来到D里面CTRLN。Ctrl v OK。查看查看,进到这里面呢,这里面是详细的介绍了这个default partitioner它的一个分区分配策略,那它怎么分的呢?直接看上面。看这块儿能不能看懂。据说大家这个英文水平啊,啊非常好是吧?啊,那首先呢,叫default partan策略啊,也就是说默认的分析策略,那它默认的分析策略是什么呢。第一个说if a partition is设置了in the record do,比如说你如果指定的分区,那么就按照你指定的分区进行一个使用就OK了,那好,那如果我没有指定这个数据发往到哪一个分区,你看if no part啊盎设置,那but a key一直设置了,如果说你有key。
01:21
那他怎么选择呢?是按照你key的哈希扣的值对谁取模呢?哎,对你对应的这个设置的分区数。分区数。进行一个曲目就可以了。啊,那好,那如果说我发送的这个数据啊,既没有指定分区,也没有指定对应的key。那这个时候我按照什么进行处理呢?你看他说选择的是粘性分区,哎,把你粘住。哎,那什么时候改变这个分区呢?呃,Window BA,比如说当这批次数据满了,哎,那我就可以,哎进行下一个分区的一个发送,那好,那这里面是大家获取的是一个大概的信息啊,一会大家详细说啊,那看一下这个大概的结构,说这个default partitioner呢,它是实现了一个接口partition,这个是有点类似于我们之前学hi度的时候,是不是也是定一个类,然后实现对应的这个啊partition接口啊,然后重写里面get part方法对吧?那现在呢,咱们这里面也是一样的,你看它重写的是一个partan。
02:23
然后呢,Partan你看这个。哎,这里面啊,进行一个处理啊呃,那这个呢,这个源码啊,我们后面会详细的给大家介绍啊,这里面呢,不做过多的说明啊,那下面我们打开这个word文档,先看结论。刷屏PPT。先看什么结论呢,这样。还记得这个函数吗?叫record,然后下面这么多。是否在调用这个散的方法的时候。然后里面需要一个producer record,然后还有个带回调的是这个吧,这个,那这个里面呢,分成三大类。
03:00
哪三大类呢,这么三大类,第一类是在这个方法里面,我们指定了对应的分区,你看这块呢,全部都是指定分区。比如说这条数据我明确了,我要发往,比如说要发往零号分区,那好,那这个数据呢,就必须发往零号分区。好,那有的时候啊,你会发现我们没有指定对应的这个分区,但是呢,我给传入了对应的K值。那这个K值怎么做?这里面说了没有指定分区,那么我们就按照K的哈奇库的值对这个主题的这个分区数呢进行求。哎,那就能得到定的值。那我们举个例子啊,比如说我们那个K1的哈起扣的值是五,K2的哈起扣值呢是六。那么我分期说我设置为二。那你好,五对二求模得几啊,是不是得一啊好,那六对二求模呢得零,那你K1就发生到,哎,K1的Y6值发送到一二分区,哎,K2的这个Y流值呢,发到零二分区,就这么去处理啊。
04:02
行,那下面呢,是这个这个呢,就是我们最开始的时候发生了一个艾特硅谷。啊,五条二条五,那么也就是说没有指定分区,也没有指定key的时候,它按照什么规则进行发送呢。那这里面说明了说既没有分区又没有key的情况下,卡夫卡呢,是按照粘性分区进行一个处理。啊,属于的粘性就把你粘住对不对。那会随机选择一个分区。比如说第一次呢,我是随机选的,因为你比如说你有0123个分区,那我先粘谁呢?假如说我随机选到零,那我就把零粘上。那什么时候我不粘着他了呢?哎,这里面说哎,并尽可能的一直使用该分区,直到该分区的这个败去满了。那BA体大小呢,比如说16K是吧?啊,就相当于一个妹子是吧?啊粘上了宋物老师,那什么时候这个放弃生物老师呢?哎,直到生物老师里面的钱啊,兜里的钱全花没了是吧?哎,就OK了啊道理是一样的啊,那那一个呢,是这个BA满了16K,那还有一个呢,就是。
05:04
已经完成,什么叫完成啊,就是LMS时间到了。是吧,比如说宋老师他这个身体不太好啊,三秒钟结束了,那这事呢也结束了啊,一个呢是批次到,另一个呢是时间到啊。任何一个满足都要执行下一分区,那他选择下一个分区的时候怎么选呢?你这是012,我第一次选择零,那我下一次选谁,记住卡不卡呢?随机选一个分区进行使用,只要和上一个不同就可以了,你说上一次你选择零,那不好意思,即使你下一次随机再选中它,那也不行,那他得换啊,直到选出来不是跟零相同的,比如说一或者二,那就OK了啊。那么举个例子说,第一次随机选择是零二分之等零二分区批次满了,或者这个0Ms时间到,那么卡不卡呢啊就。再次随机选一个分区啊进行分配,跟零不一样就可以啊,这是它对应的规则,那它是不是这样的规则呢?那接下来呢,我们来测试一下,好吧,测试一下。
06:00
行,那我们嗯,怎么办呢。我们之前写过一个,呃,自定义生产者的,对吧,啊这个。RR,在这基础上我加上P2T。Part。复制一份。这个呢是带回调的。我们简单检查一下代码,看这块儿第一步创建一个生产者,第二步呢发送数据,第三步关闭资源,那上面零呢,是对应的这个配置信息没问题,那现在我们要在哪里处理呢?哎,主要在这个散的方法这块,把鼠标放在这CTRL加P。对吧,哎,这几个方法展现在我面前,那我们首先测一下指定分区。那指定分区,我们就指定什么呢?比如说我指定一个哈。好,指定分区。但是你会发现指定完分区之后,我们是不是只能用这个,那用这个的话,你这里面是不是得传入一个K值啊,啊K值,那这个K呢,我们就给他传一个空啊。
07:07
配置。啊,这已经有了,那这样吧,啊一。看P值是空啊,因为你这里面的方法呢,你看带分区的。最少的是不是也要传一个K和Y6啊啊,所以说这里面我就给这个K呢,只是传空之后呢,分区,我指定这波数据发送到一号分区,那我们测试一下看行不行啊,直接右键执行。好,这边数据是不是已经发送到一二分区了,那发送一号分区,也就是说海哥你这有可能赶巧了,那我发送到零二分区,看行不行再来一把。没问题吧,哎,零号分局没问题,那我们再发到二号分局看行不行。
08:01
好,那这边数据呢,也能发送到二手分区,那这样呢,就是说指定分区,那就会按照你指定的分区进行发送啊,那如果我不指定分区把这干掉。不指定分区的时候呢,我指定K。好了啊,看这位置。相当于我们采用的。相当于我们采用的是这个。对吧,嗯,指定K,那指定K我传一个谁呢?我传一个A。看行不行,那这个K就是A右键就行。说指定K的话呢,是按照K的哈希扣的值来进行分配,对吧,那现在呢,我数据发送到一二分区,那好,那下面我改一下,我改成B。我再来执行。那就按照B的哈希扣的值对这个分区数呢进行求模。二分吧,对吧,嗯,一二,那同学说海哥,那我来个C是不是应该是零呢。你想多了啊,先告诉你,你想多了啊。
09:03
诶,发生到一号分区是吧,不是你想象的零啊呃,其实呢,它是哈奇波的值,那我们来一个F。看哎F的话呢,哈希勾特值对这个分区数球模就会发到零号分区。比如说指定key呢,也是可以的,那像指定这个key啊,在生产环境当中用的还是比较多的,给大家举个场景啊,啊未来我们在企业里面呢,在这个javae后台会有N多个MYSQL数据表。因为Java给我们的数据啊,往往是在买色里面,那我们希望做一些什么事呢?比如说这里面有一张订单表。我们希望把订单表里的所有的数据发送到卡卡的某一个分区。哎,单分局。是吧,发送到某一分区,那这个怎么实现。啊,之前呢,这是一道面试题,其实非常非常好实现啊,只需要在这个key值上把谁放过来呢?这个key啊,你放上这个订单表的表名字。
10:03
那这个表名字呢,哈西的值,那是不是一定会发到某一个分区里面去啊,啊,这个呢,要知道一下啊,也就在生长环境当中,这个呢是非常重要的,一般会把一个表名字作为key传进来,那么这波数据呢,就会进入到一个分区,方便我们后续的一个统一进行一个处理啊。好,这是这个,那下面呢,还有一种方式呢,就是没有指定分区,也没有指定T,那这个呢,其实我们之前已经演示过了,对吧?哎,那这个呢,就是嗯,随机了啊,按照这个粘性粘性去分区。你再找。啊,二号蜗居是吧,啊,这是粘性啊,那粘性的话呢,这时候你可以这样啊,做个什么事呢。SH。点sleep啊,你睡个两毫秒。哎,然后这样,它这个分区啊,容易打散,而且你这个值呢,你不发五条啊,你发送这个。嗯,50条吧,50条也差不多。
11:05
来,你看现在发生的数据啊,就有这个零号分区,有二分区,也有一号分区的了啊,而且呢,你看尽量的是连在一起的。行,那这个呢,就是这个啊,生产者的一个分区分配策略。
我来说两句