00:00
好,那接下来我们还有一个内容,就是说既然你可以哈希分区,那按道理说我可以自定义什么。分区器对吧?啊,自定义分器,好,那接下来我们写一个什么。自定义分区器的一个内容,那首先呢,我们应该在这创建一个包,对吧,创建一个类吧,Class这个呢叫。呃,他着呢。我的点叫可以吧。放在不同的包里边放,诶这个包名再改下,这个报名没有写那个。对吧,啊,要不然这样就不好看硅谷。那这样你看在同一一个包下是不是有两个包啊,你写代码规范一点啊这种啊,当然也有那种包的一个设计也可以啊,麦式的,那既然它是一个你自定义的一个组件,我们之前说过自定义的组件,你要不然要继承一个什么东西,或者实现一个什么框架里面的一个类吧,对吧,那我们这继承按道理来说,它既然是一个分居器,那继承的是什么东西啊?
01:07
叫partition的,而且大家之前在那个什么。MR当中是不是也自定义过分区对吧?啊自定义分区,那我们叫这个partition呢,看有没有。有,但是看到它是一个生产者底下的,没问题吧。接口对吧,好,那这个地方应该改成实线对吧?啊实现alt加回车。实现相应的方法啊,确定。三个方法。一个是读配置信息的。关闭的还有一个,他来。看这个地方。他此时就不是你简单的要的,你前面传的类型,现在到我这儿还有类型吗。
02:02
前面我们传过来是不是写的string string啊,你看这个地方它定义的类型。叫叫bad数组。说明什么问题啊,已经序列化之后了,已经序列化之后了,因为序列化的时候,它还有什么类型呢?没有了它,它放的类型也只有什么呢。Object的类型了啊,给你放在一个object啊,不管什么样的object的类型,好,那接下来还有一个问题,就是说你在这个里边啊,你能看到K能看到什么。Value吧,所以这个里边呢,如果说我们用自定义分区的时候。我可不可以按照K分区?我可不可以按照百六分去。可以吧,啊,这一套都可以啊都可以,那我们来看一下这个地方有,其实你不用改了,那假如说我自定义分析里边,我统一的也在这个地方写到零这样。我写到什么到一号分区可以吧啊,返回一个一啊,就不不按照什么P啊这块,你可以按照K的什么哈希值,来我们看一下系统里边是不是真的说像我们说有一个什么哈希的一个内容,对吧,点进来。
03:12
那如果有的话,一定是他那个什么。实现。对吧,如果有的话一定是实线嘛,CTRLH。有一个什么。这个是咱们自己写的吧,啊集成结构里边咱们自己写的也在有一个默认的分区器啊默认的分器来看一下默认分析它也实现那个内容对吧?来在这分区。啊,在这儿的一个分区来。他首先啊。获取了一下集群当中关于这个主题的。正因为我们自己知道三个是不是我们直接除以三啊,但是。在生产环境当中,或者说你对一个不知道的主题,你想用的话,或者说你想写一个通用的,假如说咱们自己这写的,我把这个K给它拿出来,把它变成S对吧?假如说这边T点突出S,然后再模拟这个三,模拟三取得这个结果,诶return它这个东西的吗?
04:15
啊,思令也不行啊,思令怎么模拟点哈西扣的啊,点哈扣的模拟三啊,用这种方式来,但是你这个如果说写死三不太合适吧。那你这个就不通用了,是不是只能给三个分区,假如说人家只有两个分区。那就有问题了吧,啊,或者说人家是四个分区,你有一个分区一直没有数据,因为你模拟的是三,所以呢,你看啊,他这块是什么,有一个class的集群信息进来了,集群信息它就通过这个class获取当前什么。Part,然后拿到他的一个size啊,拿到他的一个是这个意思,好,那接下来看啊往下走。如果他K。为空。
05:03
如果他key为空。他怎么办?注意他能进到这个里边来,一定是你没有指定分区的,如果有指定分区进不到这个号能听懂,他就不走这个分区器了,因为我指定了分区,我还走分区器干什么。所以这里面我们只能看到两个逻辑,K为no和。不会弄的。对吧,啊不为道的,然后不为闹呢,你看一下。他只不过说用了一个工具类吧,优就这个里面去做了一个什么。哈希对吧,做了一个哈希,然后模拟。分区数吧,啊,就根据哈希来的,在这个地方啊,如果说前面这个逻辑是不是我们所说的,既没有指定分区,也没有指定K啊,啊刚才说这个逻辑啊,就进到这个方法里边,一定是没有指定啊,如果指定了啊,它不会进到这来,它进不到这来能听懂,因为指定了我还看你,我还计算一套干嘛呢,对吧?啊默认的分析,那首先呢,他去拿了一个什么NEY6,这个就不用管了,我们看核心的,看核心的首先呢,他把你里边可用的分区给他拿过来。
06:17
因为有可能某一个分区所在的leader follow全部挂掉,是不是有这种可能性?假如说你有012号分区,假如说你分区资本数设置为一个。假如说分区数为三,副本数为一,能听懂。现在是不是012,这个012只有一份吧,那接下来零在零号机器一在一号机器二,零台机器挂掉了,是不是二号分区等于不可用,对吧,那这一步操作呢,它就干什么。获取可用的啊,或许可用的是这意思啊,或许可用的好接下来。如果有可用的。
07:00
啊,这边说了,如果没有可用的,Else,逻辑简单一点,没有可用的就干什么,给一个空的什么。大地震啊,就后面可能处理过程当中报异常啊,报异常那不用管,那我们要走的是这个逻辑的啊,要走这个逻辑,那你看一下他首先怎么做的,拿到什么一个next value,根据这个topic取到一个next value,这是随机一个值,然后模拟它的一个什么。可用的啊,可用的一个分区啊,可用的一个分区,好,那接下来。他拿到这个帕。他拿到一个帕,然后再拿着这个帕去干什么事?获取我们可用的分区里边的可用内容吗?啊,这个next value不断的去做了一下,我们看下这个方法。这是number与啊,这个是随机数啊,随便随便给了一个数,那我们看一下它累加的一个过程,嗯,Next value这个方法啊。
08:01
Get equipment这个里边就是他做累加的一个过程啊。这款你看最后一个他是不是调用了这个地方。注意这个是针对于某一条数据进来的,对吧,下一条数据是不是同样还要调这个方法,那这个方法是不是一个全局的在这块这个方法呀,把topic传进去,它有一个接收器,不断的去做累加,累加啊这边呢,就是做累加的get and。叫什么?获取并且。增加对吧,啊增加就是我们之前所说的一个。轮循的一个逻辑就在这儿,因为它自增一之后啊,自增一之后还是模拟你可用的分区。能听懂这意思。啊,所以先开始呢,有个随机数,随机数完了之后呢,还是去拿着这个去干什么。模拟分居数。
09:00
还是模拟这个分居数吧,所以你看你自增一,你现在假如说你第一次随机的是三,假设它随机数比较大,因为他拿着这个随机数之后还要干什么。还要跟一个number去取。这是什么余对吧?啊还要趋于,所以说它里面的一个操作比较复杂一点啊,比较复杂一点,但是不管怎么样,它一个一个的去加一对吧?啊一个加一整个内它一值呢,等于加一,然后呢,拿着这个加一的这个值,首先有个随机数对吧,X模拟三,然后X,假如说X加一,然后模3X加二,模以三是不是第一个这个东西咱们不确定。第一个进到哪个不确定吧,但是后面是不是就确定了,就是我们所说的轮询的一个策略能听懂啊,他不是说就是0120202,因为每一个人每一条数据进来的时候,他当时其实也不确定当前还有几个帕活着,所以他做这个事也很合理的。我们要写代码的就会就不会这样,你肯定是这样,那就很简单,我先把所有的什么分区拿出来。
10:02
然后获取它它这个size,然后在里边去把size变利了size吧,第一个给零,第二给一,第二第三个给三,对吧?啊一直这样点下去,然后再从头来吧,这个是我们所想的雷群,但是其实人家这种更合理一点是不是?因为他要把当时这条数据进来的时候,一个可用的分区干什么。给他拿出来。啊给咱是做这个事儿,然后接下来对可用的分区去去模对吧,啊还是就取模,所以呢,这个是才是它真正的一个,呃,这个轮询的一个逻辑啊轮型的逻辑,而且呢,大家看到这个点,而且最后这个地方对吧,只不过人家用了一个工具类去封装了吧,啊用的工具类去封装了,还做了一个什么。啊,还做了一个运算吧,啊,还是要做这个运算啊,最核心的还是要哈希这个什么。K是不是FK的一个哈希值来做的,没问题吧,啊,只不过说它并不是像我们如果说我们自己写这个代码应该怎么写。
11:02
如果说我们写是不是这样的,对吧,只不过说模拟的这个内容应该这样写啊,应该是class点,嗯。如果说我们自己写的肯定没他写的好,是这个样,Attention假如说把这个topic给他传进去,对吧?啊,传进去得到它这个内容。啊,然后。点。那个我们要的是什么东西啊。嗯,对,诶这个东西我们叫的方法不是他这个方法啊,这个是直接求的是count的对吧?啊,直接求的count不是具体的分区了,那我们应该要写的是不是这个内容,因为我们说了三,你不能在这写三嘛啊,假如说我们自己写是不是按哈希是这样写的,这个是我们所理解的阿一个的,只不过是人家在封装那种原码的时候呢,做了多一层的封装而已啊,做了一个什么运算啊这些东西。这个主题当前这个主题的分居数啊。
12:00
For嘛。没问题吧,这个方法我们不用看它怎么实现的,你看这个其实大家写代码说什么方法名啊,或者说这个变量名啊,限明之意对吧,这样就好看,你需要关心它里边怎么做的吗。你调这个方法的时候,你最关心的是不是他能给你返回什么东西啊,对吧,又不是让你自己写这里边的实现有能不能理解这个事,对吧?啊,他告诉你了它这个地方呢,是part提come for topic,然后传一个topic进去,那就当前你传输的这个topic有多少个。分区对吧,他说了分区数啊分区数,那这样是不是我们所说的,我们所理解的那种哈希啊,啊大家想的应该这种啊,想的这种,那这样我们简单一点,因为这个呢,还是哈希值来的啊简单一点这个就不写了,然后我直接在这干什么。一个一啊一个一,因为这里边怎么写,就是与业务逻辑相关的内容,对不对。假如说类似于你在M8当中按电话号进行分区,那这块假如说传进来的这前面K是电话号,或者Y6是电话号,我按电话号那种分区规则可不可以。
13:08
是不是也可以吧,啊,一样的一样的,这里边是你所写的逻辑,那只要这个我们能应用上。我们最关心的是是不是这个怎么给他跟我们代码关联上呢。有没有问题啊,对吧,因为逻辑是跟你公司我这个写的再花里胡哨。你在公司当中也用不了吧,对吧,啊,公司当中还是是自己业务逻辑来,而且呢,你公司当中传的这个K啊value啊,都不一定跟咱们这个一样的,对吧?啊所以呢,它不一样,那我这个直接写个什么。一啊都到一号分区啊,其他的什么close我们也没有什么资源,然后相应的配置呢,我们也没有什么配置可获取,所以也就不用管了,对吧?啊不用管了,那接下来问题关键在于什么。如何使用这个爬上的,对不对啊,这里面去,那同样的我们再来一个class叫。
14:01
PR的一个什么producer对吧?啊,我们自定义的这个producer,诶这块呢,同样的来一个什么psv啊PSVM,那将来这一套这里的东西我就不写了,可以吧,啊已经写过两回了,我就把这个直接给他干什么C给他拿过来吧。啊,在这。看到没,这个不写了可以吧啊,如果你想写的话,自己可以敲一下啊,自己敲一下好,那接下来的问题就在于什么。如何关联的问题?对吧,如果关联,那大家觉得在哪关联。这有传一个什么分区内容吗?我看到了。没有传一个party类进去吧,没有吧,也没有说传一个part的这个对象也没有吧,啊,什么都没有,那我们只能怎么做?只能在cor吧,因为它有三个地方可以啊,第一个是不是在这儿,你传分区进去。
15:00
啊,假如说它真正的设计的时候,是不是可以把这个东西设计在这,你在这传一个分区的类进去,对吧,或者让你传一个对象进去,好,第二个是不是你在创建生产者对象的时候,也可以来指定当前这个生产者按什么分区是不是也可以。对吧,它可以设计在这儿,还有第三个地方在哪啊。是不是配置信息啊,啊配置信息是这个意思,那我们看这这有吗。这有吗?没有吧,它有K的什么序列化,Y6的序列化,这个东西你可也就是说K的序列化跟Y6序列化,你可以不写在前面,可以写在这儿也可以吧,啊,他自己也加在你那这个没必要,那也就说只剩下这一个地方,那问题来了,这一个地方它。是K是什么呢?这个因为这个里边是不是promise点。260。那我们先想一下,大家觉得这个value应该是个什么东西?还是你们那个。
16:00
自定义写的。是不是应该是自定义这个分区器的全类名啊,对吧,自定义组件我今天提到的基本上都要用到什么全类名啊,都要用到全,因为它通过你的全类名,通过反射的方式去构建对象,对吧?因为这是一个配置信息啊,配置信息啊,如果说类似于自定义组件在这个里面,如果说真的在这方法里面用的话,那一般就不是全类名了,一般就是那个类的什么。对象能听懂对吧?配置文件里边一般都写的全类名,如果说直接传给方法,那就不是全类名,那就是对象,那既然在配置文件里边,那这就全类名啊,我们讲的是全类名,那我们先把这个全类名拿一下copy什么。Reference放在这。好,那接下来是它这个K吧,那你告诉我这个K应该去哪找呢?要不然你把它记下来,但是有必要记吗?没必要记,我们之前不是提到了有个这个类吗?点开点开,既然你看,既然你是跟分区相关的,那你这个里边一定带partition,我不管这个你的key叫什么,呃,什么producer.partition也好,叫partition也好,叫什么东西,一定有partition这个词对不对,如果没有这个词,那怎么知道是这个属性呢?
17:16
对吧,那我们说一下。走啊,这个不是要的属性吗?啊,这一二加二。就这。实际上就是什么叫partition的,点class啊,点class啊也就这意思。然后或者你这样写也可以吧,写producer con.part class conig是不是一样的啊,或者说你直接把这个复制过去也一样的啊,那我们直接把这个复制过去啊在这。诶,在这个地方吧,是不是扔到前面啊,这样就找到了它的一个什么。K吧,啊,找到了一个K,那肯定跟爬的相关的嘛,好,那这块呢。
18:00
加这个叫添加分区器对吧?啊添加分区器这个内容好,既然添加了分区器,那这块是不是我们应该用回调函数来看一下,是不是都发到一号根去,因为这样我们看不出来对吧?啊看不出来那另一个。Call back。Go back,那这个里边。我们直接这样吧,嗯,把这个地方我们之前不是写过一个,我把它拿过来吧,这个就不写了,是不是在这个里边把它拿过来吧。这个方法体的实现啊。放在这没问题吧啊,分区和offle啊,其实这个时候我们就已经不关心那个什么了,关心的是不是前面的分区对吧?OK,那现在我们写的my partition呢,是啊。一号分居对吧,好,那来走一下。没问题吧,啊,在一号分区,那同样的,我在这个里边把它改一下,改成零号分区对吧?啊,那他就进到什么零号分区啊分区这个呢,你随便就是是你业务逻辑来定的对吧,那说明我们分区器是不是起作用了,对吧?啊说明我们分区器起作用,也就是说它自定义一个分区,最重要的不是说这里边逻辑怎么写。
19:20
逻辑怎么写?你学习的过程当中,你写的再多其实也没用,生产环境当中逻辑会变吧,但是这一套流程会变吗?不会吧,你要实现这个part的,你要做这个事去按照什么T啊,Best啊,这个逻辑啊,可能会变,每个公司都不一样,但其他的你要该写的这些东西。会变吗?不会变码,但是有一个点就是生产环境中有个代码,就是这这个地方啊,它肯定不会写零,还有一个是你必须要做的,就是我们刚才所说的什么事。Plus点去获取吧,你也可以跟他一样去干什么,获取当前可用的,然后先获取总的是对吧,然后就获取可用的啊,它可用的这样,因为这样就是更更靠谱一点,假如说真的你在生产环境中某一个分区挂掉,不至于说整个业务线这块就断掉了吧。
20:08
假如说你有一个分区挂掉了,现在我死活二挂掉了,我死活就要往外发,能发的进去吗。那是不是会报错啊对吧,那假如说挂掉,因为我们说了挂掉有有可能会是正常的一个事情啊,机群挂掉一台对吧?啊,所以呢,你还是同样的就获取一个可用的啊,这块呢,就是跟我们有一点区别的就在这块啊,你不要直接在这写数字啊,不要是模拟三模拟二,那这个东西就太不靠谱了,能听懂啊这个意思。
我来说两句