00:01
好,我们接着往后说啊。呃,上午的话,我们把这个业务数据的采集和分流啊,呃,基本上已经算是把它这个做完了。啊,然后最后呢,我们还有一个呃,这个话题啊,我们需要这个一起来去研究一下啊,那这个话题的话。也是我们在这个实时处理过程中啊,大家这个需要呃考虑到的啊,来一起来看一下,就是这个数据处理的一个顺序性。好呃,那这个看这个概念的话,应该也是不好,也是不太好理解啊,这个什么叫这个数据处理个顺序性呢。对吧,我们。给大家去这个描述一下啊,大家一起来跟着我去想一想啊。呃,我们在这个实时的计算中啊,我们对这个业务数据的一个计算啊,我们要考虑到这个处理数据的一个什么顺序。就说白了啊,就是能否按照这个数据改变的一个顺序呢,然后进行这个处理。啊,比如说我们假设一个场景啊。
01:00
呃,假设我们将某个用户。数据的姓名字段进行什么多次更改?啊,比如说你原来是A,然后呢,我改成了个B啊然后呢,接着呢,我又改成了个C。好,那么你在这个数据库层面的话呢,你最终保存的结果肯定是一个C。对吧,就相当于啊,你把某个人的名字啊,我们找上一个右侧info啊。呃,User info对吧,就比如说你把某个人名字啊,又原来是A,然后你改成了个B,然后呢,又改成了个C。对吧,那你的这一次动作就是先改成这个B,然后呢,再改成这个C啊,那你这个动作在这个数据库层面的话呢,肯定是B先执行,然后呢C后执行的,这个是有顺序的。对吧,好,那现在我的问题是。你的这两次改动啊,就先改成B,然后再改成C,你的这两次改动呢,其实就会被我们的Maxwell给他是吗?监控到,那监控到以后呢,我就会把你这两次改动的数据呢,诶发送到我们这个实时的处理过程中。
02:00
最终的话呢,我们是要把数据呢,诶放到这个dim里面的,就是放到你的这个维度层里面啊,比如说我们这个ras中,好,那现在我们的问题就是。你在数据库层面的结果是C,但是我们能不能够保证我的数据经过这个实时处理以后,在你这个dim层存储的结果也是C啊?他有没有可能你存储的结果变成B。对吧,大家去琢磨一下这个问题。啊,就是你数据库层面,你是先从B变成了个C,对吧,那按照我们正常情况的话呢,我们的实时处理的时候呢,应该也是先处理了B,然后呢,后面呢再去处理C。对吧,这样的话就能够保证我在我这个DM层存储的时候呢,它的结果呢,也是一个C。是不是啊,当然这是我们希望的啊,但是我们现在这个代码它能不能够保证,诶,你是按照这个数据改变的一个顺序进行这个处理的呢。
03:03
对吧,这个就是我们需要去审视一下我们这个代码啊,我们在整个这个实时处理的各个环节中,我们是否能够保证数据的一个顺序。如果说你不能保证的话,是在哪个环节出了问题。最终导致了你这个存储的结果呢,不正确。对不对啊,这个时候你要去从头到尾啊,审视一下我们整个的这个处理过程啊,就相当于从这里面啊,从这个代码的这个一开始啊,拿到数据开始啊,甚至于呢,呃,从拿到数据之前,你都可以去审视一下,比如说你的数据库层面,Mal层面。对吧,卡不卡层面,然后Spark simi层面。以及最终你写到这个rad层面。对吧,你挨个去审视一下,好来我们这个一起来分析一下吧,啊呃,给大家这个画了一个图啊,我们把这个图打开啊,我先打开一个空白的啊。大家觉得我们现在这个程序能保证这个顺序吗?
04:00
啊,想一想啊,其实我们是有问题的啊,一起来分析一下。呃,那我们就从这个整个处理的顺序上来去说了啊,首先你的第一个层面就是买so狗啊,因为我们这个对买sol的修改啊,就比如说我们啊,先把这面改成B,后改成C。对吧,这个层面的都是什么,对你这个买SQ的一个修改,好,但是我说过对买S的这个修改,它一定是没问题的。因为你的两个操作,你进到这个买里面以后,肯定是先执行B,然后再执行C的。能听懂吧,因为你的修改操作在这个买soql里面肯定会有一个这个事物的一个控制,对吧,或者说呢,诶我会有一个什么这个写的一个什么分离操作,比如说我在写B的时候呢,我会什么加锁,然后写完以后呢,你这个C呢,再去做这个写操作。对吧,所以这个从MYSQ层面来讲的话,它一定是能够按照你操作的顺序,然后呢进行修改的,就是先改成了B,然后呢再改成了C。啊,因此这个层面我是能够保证你的顺序的。对吧,好说它是可以什么通过的。能理解吧,好,那么再来往后审视啊,那你这个MYSQL里面做了修改以后,诶我们的MYSQL呢,就会什么写这个blo。
05:07
对吧,就会写blog,那我们就审视一下blog层面,它记录的这个顺序能不能够保证。你先改成了B,后改成了C,那你在这个b log中去记录的时候,你能不能够保证我先记录的是B,后记录是C呢?这个大家想想能不能保证。这个是不是也可以是也是可以保证的呀,因为我的MYSQ去写嘛,你当我发生这个B的修改的时候,那我肯定要什么往这个b log里面去写个B,对吧,当你发生C的修改的时候,那我就要往B浪里面写个C。对吧,所以说呢,它也是可以保证的。啊,Blog也没有任何问题,它也是可以保证的。好,那我们再往后走,再往后走的话呢,就是你blog里面写的东西以后,那我的Maxwell就登场了。对吧,Max就登场了,他要什么帮你去做?做什么呀?是不是做这个采集了呀。对吧,OK,那我要审视一下,那我的Maxwell。
06:03
它在采集的时候,能不能保证这个采集的一个顺序性,比如说你里面写的是先写了个B,后写了个C,那我采集的时候是不是一定是先采集到B后采集到C的。这个能不能保证啊,同学们。这个是不是同样也是可以保证的,因为我是读你的b logo文件嘛,那我读文件肯定是什么,从上到下去读呗,从上到下从左到右去读呗。对吧,肯定也是可以保证的啊说这个Maxwell呢,呃,诶这个一个大写一个小写是吧,无所谓来,那这个Maxwell呢,它肯定也是可以保证的。OK,所以说呢啊,你这几个环节我都是可以保证你这个数据处理的一个顺序性的好,接下来呢,我们的Maxwell呢,就要把你采集到的数据呢,往什么呀,往你的卡不卡去写了,所以说下一个环节就是这个卡不卡。好,那我们来考虑一下,我把数据写到卡夫卡里面以后,我能不能够保证我数据的一个顺序性。这个大家去琢磨琢磨啊,能不能保证你这个数据的一个顺序性。
07:06
比方说,我先采集到了B,后采集到了C。对吧,那我要把这个采集的数据呢,往这个卡夫卡中去写,那我写到卡夫卡以后呢,我能不能保证我一定是先把B写进去的,再把C点进C写进C这个写进写进去的。这个写的顺序一定是先写了B,后写了C。对吧。写的顺序肯定是没问题的,但是你存到这个卡夫卡中以后呢,因为接下来我们是要从卡夫卡去消费数据的。那你能不能够保证我先把B消费出来,再把C消费出来?对不对,哎,这个环节你就要去琢磨琢磨了。啊,所以说呢,其实对于这个卡不卡来讲啊,它是不能够绝对保证你这个数据处理的一个顺序性的,对吧,大家都想到了啊,如果说你是单分区的话就可以对吧?啊,如果这个多分区的话呢,呃,就不太保证了,对不对,好来说一下,其实并不是这个单不单分区啊,主要还是看你这个数据往哪里去写啊,我们一起来分析一下。
08:06
这里面有这么一个问题啊,卡夫卡层面我们要去考虑你这个是否是这个多分区。如果说你是一个单分区的情况下,那我还是能够保证你数据有序的,比如说我的卡卡里面就只有一个分区,那你写数据的时候肯定是先把B写进来,然后呢再把这个C写进去的。对吧,这是一定的。能理解吧,但如果说我们是多分区的话,这种情况下你也得看情况。如果说我是多分区啊,你的数据呢,恰巧是发送到了不同的分区中了,比如说B发生到它里面了,C发生它里面了。那这种情况下,我就不敢保证你后续处理的一个什么顺序了。但如果说你在这个多分区的情况下,诶,我还是把B和C呢,发送到这个同一个分区里面了。那这个是呢,我在后续的处理的时候呢,还是能够保证你这个处理的一个顺序性的吧。对吧,说是在这个卡不卡层面,诶,我们就得看情况了啊,说他就什么不是绝对性的,能够保证你的处理的顺序性啊,就是一个黄的了,就是警告了啊,说这个地方可能会出现数据的一个乱序了。
09:08
好,那到底乱序不乱序,就得看你有没有考虑到这几个层面,你是单分区的情况还是多分区的情况,如果你是多分区的话呢,你能不能保证你的同一条数据的修改写到了同一个分区中。对吧,你要去考虑这个事情。OK吧,啊行来这个是环节啊行,那这个卡不卡环节,这个完事以后,我们接下来到这个Spark环节,那这个Spark这个环节我能不能够保证你这个数据处理的一个顺序性。就假如说啊,他先读到了B,后读到了C。那我在处理的时候,我能不能够保证先处理的B,后处理的C?啊。这个环节是不是也得去审视一下,它其实也不一定了啊,同学们,首先啊,它这地方的话,因素就比较多了,第一个因素就是假如说我卡不卡,拿出来的数据我就已经没有去了,比如说你的B和C呢,写到两个不同的分区中,那对于我的Spark拿出来以后呢,我就不一定先处理C还是先处理B了,因为你是不同的分区,那对应到我的卡卡中,他们就是想将来什么呀,不同的这个task,那你不同的这个task将来谁先执行谁后执行,那我可就不敢保证了呀。
10:20
对吧,我就不敢保证了啊,那如果说诶你前面是能够保证这个顺序的,比如说你是个B,你是个C,你们在同一个分区,那到了我这个Spark层面以后呢,我一定是先把B拿出来,再把C拿出来的,这个顺序是能够保证的。理解吧,但是呢,我只能够保证我拿出来的顺序,其实我也不敢绝对保证,我处理的时候呢,就是先处理的B,后处理的C。因为在这里面其实还有一个大家可能会忽略的一个点啊,就是你在Spark中,然后去做操作的时候,他有可能会有一些操作会。给你进行什么呀。重分区操作。对吧,你们应该都讲过那个什么重分句的一些操作是不是。
11:01
他有可能会进行什么充分区的操作,就是相当于本来你们是在一个分区里面的,但是到了这个Spark里面以后呢,因为我进行一些什么操作,然后呢,把这个B和C呢,诶放到了什么不同的分区里面了。那你最后再去处理的时候,那可不就那可就不敢保证你到底是先是B还是先是C了。能听懂吧,啊说这个Spark层面呢,它其实也要考虑这么几个点啊。首先你要考虑就是使用的这个算子呢,是否会打乱分区,如果说数据到达Spark是有序的。且Spark没有重分区的操作,那我是可以保证数据处理的一个顺序性的,反之我是不能保证的。那假如说我数据呢,到达这个Spark就已经无序了,就是我的数据到了你这里面就已经无序了,但是呢,我想从这个层面再做到有序行不行呢,也是可以的。那你可以干嘛呀,你可以考虑做一个什么重分区,就说白了啊,你的B和C呢,不在一个分区,那我现在什么,我在18个层面呢,做一个重分区,我让他们两个呢,放到一个分区中,但是你放到一个分区中以后呢,不一定是B在前还是C在前呢。
12:04
所以说你还得怎么对这个分区里面的数据呢,再去做一个排序。对吧,再去做一个排序,比如说你按照什么按照这个修改的时间做排序,你先改的B,后改的C,那我就什么按照你的修改时间排序,那一定是B的修改时间是要小于什么C的修改时间的,那我就可把B呢排到这个C的前面。对吧,就相当于我可以什么,你前面已经乱续了,但是到了这个Spark层面以后呢,我还可以再给你啊矫正回来。明白了吧,啊,但是呢,这个重分区的这个操作的话,我们最好还是尽可能不要去设计它啊,因为它这个性能肯定是不是很好的。理解吧同学们啊,说是一个Spark层面的话呢,也是啊,它是不能够保证你这个数据的啊,不能够绝对保证你这个数据的一个处理的一个什么顺序性的。OK啊行,那再往后省事的话,就是我们要写到我们这个后面的最终的这个RA了,对吧,就现在我们的处理过程是把把你的维度数据呢,写到这个RA中,好,那假如说啊,同学们,假如说我前面的处理的顺序呢,都是正确的,比如说哎,我先处理的B,后处理的C,那你说我在RA层面,我能不能够保证先把B写进去,再把C写进去。
13:12
他能不能保证?可不可以保证?想想同学们。可不可以保证啊?它是可以保证的。为什么呢?因为red是什么单线程操作对吧,就说白了你的写B写C这两个命令你发送给这个red以后呢,只要你是先发送的B。对吧,你先发送B的前提就是你前面的处理顺序是有序的,那你先把B发给,然后再把C发给red,会把这个呢排个序,然后呢,我先执行B的写操作,然后再执行C的写操作。那我最终C的话就会把B给它覆盖掉。对吧,这个时候我就什么最终保留的是一个C。啊,说这个层面啊,它也是可以保证这个处理的。
14:02
顺序线的。OK,那我们依次从头到尾去审视了一下我们当前这个处理的环节,那么有可能出问题的就是你的卡夫卡和你的Spark层面。对吧,啊,当然哈,这是我们目前的这个情况,那将来如果说大家再去写这个别的这个事实的时候呢,其实你要去考虑到这个问题啊,那你要去审视一下你整个的这个环节中都有哪些环节可能会导致数据处理的一个什么,就是乱序问题。啊,能不能矫正回来,或者说呢,这个问题会不会影响你,如果说不影响你,那还好,如果说影响你了,那你就要什么想办法给他矫正回来。明白我这意思了吧,啊,就一般情况下啊,这个就是卡不卡,或者什么Spark,就是在这个涉及到分布式对不对,或者什么这个多分区啊多线程对不对,诶涉及到这些个点的时候呢,它就有可能会导致你这个乱序问题,如果你就是一个什么单分区的对吧,单线程的。对不对,那你只能是排着队的去执行啊,这种情况下一般是不会有呃乱序的这个问题的。
15:05
好吧,所以说呢,就是他们两个啊,可能会导致问题,OK来这是我们这个数据啊,处理这个顺序性的这个事情。好,呃,那你把这个分析明白以后来接下来我们就去审视我们现在的这个问题了啊。呃,那我们分析到了这两个环节会出问题,那我们就依次来排查一下吧,对吧,就是如果说现在我想保证我代码中处理数据的一个顺序性。那我应该怎么去入手?首先。我们想想前面的我就不管了啊,同学们,我就在想这个卡夫卡层面,我们现在是不是单分区。现在我们不是大分区,对不对。那你卡不卡层面,如果不是单分区的话,你是多分区的情况下,那就有可能会出现乱序,好而我们卡夫卡里面确实是我们是有四个四个什么四个分区的。好,那这个时候就会有问题了呀。对吧,你是四个分区,那我的数据发过来以后就有可能会乱序了。
16:02
对吧,那这个怎么办。那我把它改成单分区,改成一个分区吧。那你改成一个分区以后呢,又不太好,因为你的并行度上不去了。对吧,从你这个Spark streaming层面,你这个必须度你就上不去了。对不对,说这个分区的话呢,你还是按照这个四个分区去做啊,但是呢,我们可以什么呀,做另外一个操作,什么操作呢?就算你是多分区的情况下,我是不是只要保证我的B和C对不对,能够进入到同一个分区。这不就OK了吗?对吧,你有四个分区,但是呢,我只要保证我相同的数据,我是进同一个分区的。那我在什么分区内部我是有序的,这不就可以了吗?能听懂吧,只要你不把它发到什么不同的分区这个事儿就。不会有影响的。好,所以说我们就看一下啊,我们现在把数据往这个卡发中写的时候,我们有没有保证过这个事情呢?其实是没有的啊,大家来看一下。好,来到我们这个分流这个维度数据的这个位置啊,你看一下。
17:01
呃呃,不对啊,我们在这个,嗯。我想想啊,呃。在哪呀?这是我们的维度数据是吧?呃,维度数据呃不在这啊,在这个,呃,我想想在在哪个层面我们去解决这个问题啊。这是我们的业务数据是吧,业务数据啊,就在这对吧,就在这啊,就在这啊。呃,在我们的。哪里啊,就这吧。这不是往这个。往哪里写,这是啊,这是往卡夫卡写的是吧?哦,这我那我这个图是不是稍微有点问题啊,这个图不应该这么画对不对。看一下啊。我这个图画的最后是往这个red去放的,是不是,呃,那我想想啊呃。也行吧,也行啊,也行。
18:00
是不是啊,那就是还是这个还是这个问题吧,来这个对啊,本来就这个问题,我刚刚想错了啊,来就这样的啊,你看啊,我们现在是在这个层面,我们把这个维度数据拿过来以后呢,我们是什么直接写到了你的这个RA中的。其实这个层面你是看不出来这个顺序不顺序问题的,因为你来一条数据对吧,你来一条数据,那我就把数据呢?呃,给你什么写到这个ready中,你来一条数据我就写到ready中,那么至于你是先来的B还是先来的C啊,这个层面我是不知道的,能明白吧?啊,那我不知道的,如果说你要保证这个顺序的话,就应该什么从什么从哪里保证呢?就从这段去保证,就从你的往卡卡写的这个层面去保证,那你是什么地方往卡夫卡写的呢?是不是由你的这个Maxwell往卡夫卡去写的呀?对吧,是由你的Maxwell往这个卡卡去写的,那如果说是由你的这个Maxwell往这个卡夫卡去写的话,那我们就得从你的Maxwell去入手了。对不对,好,来我们看一下。还是看我们这个整个的这个,呃,看这个也行,或者看这个也行啊。
19:01
呃,我现在我的Maxwell呢,会从你的这个业务数据库里面去采集数据,那我采集到数据以后呢,我就会什么往这个卡号里面去写。对吧,这个流程大家还是知道的啊,那我们就看看这个Maxwell这个层面,它能不能够保证。把我们这个相同一条数据写到这个相同的这个分区中呢。就现在我们有没有去做这个事情啊,同学们。现在其实我们是没有的啊,他现在给你发送数据就是什么完全什么呀,按照你这个默认的这个分区规则啊,就是什么所谓的粘性的规则,对吧?啊,我来一波数据,然后呢,我先用一个分区,我用完以后呢,我再去换另外一个分区,我用完以后呢,再去换另外一个分区,那就有可能B给到了他,C给到了他。对吧,是这样子的啊行,那如果说我们想保证你的数据的处理的顺序性,我们想把这个相同数据的一个更改呢,我们是给到同一个分区的,诶,那我们可以什么对它里面的一些配置呢,进行一个修改啊,那这个文档里面我也说到了啊。大家来看一下啊,在这个位置,呃,我们只需要去修改你这个Maxwell中的什么一个配置项啊,应该是总共三个配置项啊,就改它这个配置文件,一个是这个producer的一个什么partition by,这个是你这个分区,你要用什么做分区,这个是你的分区的字段啊,这个是假如说这个字段不存在的时候,我要拿什么去做分区。
20:18
好吧,来我们直接到文件里面给大家去解释啊,那我们就过来吧,来到这个好OG Mo,然后呢,Maxwell好过来,呃,那这个过来了以后呢,呃,过来以后我们看看啊,在这个卡菲格讲这个里面。对吧,在它里面啊呃,这个里面我们要去找一下了啊,它是在那个parts啊,诶没有吗?那我这个手动翻一下吧,我忘了它那个叫啥了啊。我手动翻一下啊。嗯,在下面的啊。
21:01
呃,这个之前我们在讲Maxwell的时候没有给大家去提啊,我就想着说这个到这个环节以后再来说啊,好再往下走,哎,就在这啊。就在这,呃,这个配置呢,就是在配你这个往卡不卡去发送数据的时候,我们要不要做分区操作啊,要不要做分区操作,你看了啊就是。呃,它所支持的这个分区的方式啊,有很多,比如说你可以什么基于你的数据库来去做分区,基于你的表来去做分区,基于组件来做分区,基于什么事物ID,线程ID,还有什么列来做分区,有很多。好,那么大家想哈,就现在啊,比如说对于我的这一条数据来讲,好我先把它改成了B,然后呢,再改成了C,但是呢,我希望你的这条数据呢,能够什么呀,发生到同一个分区中。那你说你怎么就能够把它发生到同一个分区里面了呢?你从卡夫卡层面来讲的话,你得用什么分区进啊同学们。你还能使用这个默认的那个什么粘性的那个规则吗。
22:01
就不行了吧。对吧,那我们知道在这个卡不卡层面,如果说你想自己去控制你的数据进哪个分区的话,第一种就是什么直接指定分区号,对吧,第二种就是什么指定一个K,好,那很明显直接指定分区号,这种情况肯定是不行的,因为你要指定分区号的话,你想想啊,你在这个maxl中,首先你没法去配,对吧,你的mall的时候没法去配,就算如果你能配的话,你说这个分区号你写成什么,你写成零号,写成一号,写成二号,写成三号,写哪个呢?你写死了零号分区,那我就只往零号分区发,那你其他的分区你都没有数据。同样道理,你写死某一个分区都是一样子的,其他的分区都没有数据对吧,所以说你写死这个分区号,这个肯定是不能用的,那我们要用的话呢,只能是指定一个K。因为在卡夫卡里面,如果说你指定的K以后,对吧,它的分区怎么做的呢?它是会按照你的K,然后对你的分区数,比如说你有四个分区取余,那我取出来以后就是0123。对吧,那你想想,我只要保证我相同数据的修改,它将来写入卡夫卡的时候用的K是一样的,我是不是就能够保证你算出来的这个分区号是一样的?
23:09
如果说你能够算出来这个分区号是一样的,那我就能够保证你写入的是同一个分区。呃,这个大家都知道吗?来我这个说了这半天啊,这个大家都知道吧,那个卡不卡那个分区分区规则啊,生产者的这个分区规则,我之前在这个讲项目之前,我就给你去提到了,我说你下去回头去看一看。来,刚刚我说的那个能听得懂的同学,你打一啊。诶都能听得懂是吧?OK,那还好啊,如果说你听不懂的啊,来听我说啊,如果说你听不懂的,你下去我看这个代码啊,我给你提示一下,你下去我看这个代码,找到你这个卡不卡的produce,这是你的生产者,生产者里面我们发送数据,我们调用的是这个赛的方法。
24:02
对吧,那你在散里面,它掉的是这个什么,又掉了另外一个散,然后呢,在它里面掉的是do散,注意你就找到这个do散的方法,在这个do散的方法里面,然后呢,往这个地方去看。这一行代码就是在计算你的这个分区,你能记得吧?诶,就是在计算你的分区,哎,都都说到这了,我就再来简单带你去看一下得了啊,行,来这个如果是进步的同学,你要再跟着我看一下了啊,这一行代码就是在计算你的分区,那我们点过来,点过来以后你会发现它的第一种方式就是什么?先去尝试着看一下你的消息中有没有写死分区号,如果说有写死分区号,那我就直接给你返回这个分区号了,就说白了,我写了个零号分区,那我就什么直接使用零号分区了,我就不再去做别的操作了。如果说你没有CS分区号,那我就会什么走我的分区器,走分区器,然后呢,去计算你的这个分区,好,那我们点过来,呃,这是一个抽象的,我们需要去找到它的这个具体的实像类啊。呃,我们默认的这个分区器用的是这个default partitioner啊,点过来,点过来以后,它里面这个方法中你就能看得到,它会先去判断一下你的key有没有,就说白了,你在你的这个消息中呢,有没有指定过一个key,如果说你指定过key的话。
25:14
啊,如果说你,呃,如果说你没有指定过K,那么他走的就是你的这个粘性的一个策略了啊,这个我们不说啊,你看如果说你的key是。不等于空的,那我就会走下面这个代码。对吧,就会走下面这个代码,OK,那这个时候我们看一下。这个时候我们来看了啊,同学们。他做了什么操作呀,他就是把你的分区的个数拿出来,就说白了,你有多少个分区,然后呢,拿上你的K。它首先呢,会做一个什么计算啊,你就甭管他做什么计算,最后呢,会对你的分居数呢,做一个取值操作。就说白了,只要你的K是相同的,那么你将来对这个分区数做取一操作,取出来结果一定是相同的。理解了吧?所以说啊,我们知道了这个策略以后,那我们就回到我们的这个代码中啊,你想保证你的这条数据的多次修改能够发送到同一个分区,那你就要从这条数据中呢,找出一个他们的。
26:13
什么呀,能够唯一标识这条数据的一个什么呀字段,那一般都是我们的主见了呗。对吧,那我就会考虑拿上你数据的这个组件ID,然后呢,作为什么作为我的分区键来去使用,这样的话呢,将来只要是你这条数据的修改,那你的组件都是一,你的K都是一,一的话,对我的四个分区取一,我最后结果都是一。对吧,我就能够保证你的多次修改是进入到同一个分区的。能理解了吧,同学们好,行,那把这个说明白以后,来接下来我们就回到这里面给大家去说了啊,那我们的分区策略我想用什么呀,我就选择column,就是你的列,我要拿我表中的某一个列来去做我的分区键,那你说我表中有这么多个列。对吧,我有这么多个列,我有哪一个呢?我们指定一个什么列的字段,就是哪一个列,你要作为分区字段,那我肯定指的是ID。
27:05
明白了吧,指的是ID啊行呃,然后这个Maxwell的话,还怕另外一个事,就是他怕他怕什么,他怕你指定的这个字段呢,它有时候不存在。对吧,他可能怀疑说这个字段有时候不存在啊,但其实在我们目前的场景中,这个ID它是一定存在的,因为它是一个主见,你不可能说没有主见吧,对吧,它是一定存在的啊,行,那如果说我们用的是别的字段,对吧,那可能这个别的字段有时候就不存在,不存在怎么办呢?他说了啊,当你使用的这个列字段不存在的时候,那我就要什么通过如下的方式来帮你去做这个分区,那我就写了个table,就如果说我的列是不存在的,你就拿表来去做分区。你能听懂,你拿表做分区的话呢,我就能够保证我整个表中的数据的修改都是在同一个分区里面的。是不是也能够保证你一条数据修改也发到一个分区啊。对吧,就相当于什么双重保障好吧,所以说这几个配置啊,我一之前一直都是配上的,大家可以什么自己下去,我把它加一加。
28:02
能听懂了吧,把它加一下啊,好行,那么这就是我们这个处理数据的一个顺序性问题啊,那么从卡夫卡层面我们就得到了解决好,当然我们还得再去审视一下Spark层面。呃,目前我们的代码在这个Spark层面应该是没有什么问题的啊,同学们。因为我们在Spark层面,大家去看一下我们有没有用过一些。重分区的操作呢。并没有好吧,所以说呢,这个层面我们就不用再去多考虑了啊,只要你保证了这个层面是有序的,那我后续一定是有序的。OK了吧,行啊,这个问题呢,我们就给大家这个解释完了啊,其实主要就是加上几个配置啊就完了。好吧,行就这就就就这么多了啊。
我来说两句