00:01
OK啊,然后接下来我们写的是另外一个工具类啊,这是我的管理的工具类,来我们再去用上一个SKY类,叫my opposite有S啊。行,这个是我们的管理方案啊,管理工具类。好,然后用于什么呀?呃,用于然后这个网中啊,这个存储和。和这个读取什么读取这个upset啊行呃,这个工具类的话,在这个写之前,我们先把我们刚刚这个分析的一些点呢,给大家去这个罗列一下啊,这是我们这个管理方案啊管理方案对吧,刚刚我们是口头分析的啊,现在我简单把这个文字给你描述一下啊OK,呃,首先啊,我们的问题就是我们的后置提交偏移量来注意第一个。
01:03
后置提交这个偏移量,呃,后置提交偏移量的话呢,它的重点就是我们要这个手动控制对吧,手要需要什么,需要这个手动的,诶手动什么手动控制这个偏移量的提交啊,偏移量提交好。那你这个问题就是你分析到这个问题以后,下面就是你的这个手动控制对吧,手动控制偏移量,手动控制偏移量提交,OK,它里面带来的一个问题就是这个Spark streaming,对吧,提供了手动提交方案。哎,但是有限制啊,但是呢,我们不能用,呃,因为呃这个我们因为我们我们会什么会对这个这个流啊,就是会对这个stream的结构进行这个转换,对吧。
02:02
就是你要理解我们这个问题点在哪啊,OK,行,那我们知道这个问题以后,我们的想法就是什么呀,我们要这么去做。就是我们要什么呀,手动的提取偏移量,然后呢,呃,维护到这个这个中。对吧,就是你你用他的方案你搞不了了,那那你怎么搞啊,那我就手动的提取便宜量维护到这个外,OK,他的这个关键点就是这样子的啊,首先第一个我们从卡夫卡中诶消费到数据对吧,就先提取,先提取什么,提取这个偏移量。能明白了吧,好,然后呢,接下来就是什么呀。怎么操作呀。同学们啊,就是你。从卡夫卡通消费到数据以后,我先把这个偏移量给它提取出来,提取出来以后我就赚到手里面了,对吧,然后呢,等数据好成功写出后,好将这个偏移量干嘛呀,就是维护到啊,存储到吧,存储到我们的这个中OK吧,然后下一次就是。
03:14
呃,我们就是从卡不卡中消费数据之前,先到什么呀?RA中读取偏移量,然后呢,使用读取到的偏移量,诶,然后呢,到这个卡普卡中消费数据,对吧?大概是这样一个流程啊,但然这两步的话呢,呃,你看谁在前谁在后边,他们是一个循环的过程,对吧,我读一下,然后到卡卡消费一波,消费出来以后呢,提一篇一量,然后呢再去读。对吧,它是一个循环的一个过程。OK吧,这就是我们这个管理的一个这个方案啊,应该是一个流程啊,所以最终我们的方案就是。对吧,我们的方案就是什么呀,我们需要什么呀,就是手动的啊,将控制呃,手动的什么将偏移量存储到中啊,每次消费数据需要使用什么呀,存储到这个其实不用说了,对吧,上面是不是都已经说过了呀,相当于。
04:18
好吧,再说一下吧,来每次消费数据呢,需要什么?使用存储的ET进行消费啊进行消费,然后呢,每次呢,消费到数据,要消费到数据后,消费数据后要将要将什么呀,本次。诶,消费到的位置啊,就是要将本次消费的opposite,然后呢,再存储到存储到这个中,对吧,就这样的过程。好吧,上面上面就相当于你我们的这个一个问题的一个什么分析了,对吧,分析过程啊,然后下面就是我们呃,这个这个手动的去控制它OK吧,行,那你把这个一分析的话,就相当于我们整个这个这个管理里面,我们就需要有两个功能啊,第一个功能呢,就是呃往RA中存储。
05:15
存储opposite对吧,然后第二个功能就是什么呀?呃,从这个red中读取存储的opposite。对吧,你看不是正好是对应这两个嘛,从re面去读,然后呢往面去存。对吧,正好对应这两步。然后了吧,正好对应这两步啊好了行呃,那这个分析出来以后,下面就是代码的实现了啊,这个代码实现的话。那么大家就得什么去想想了啊,你说我往面去存,我到底要存什么东西?对吧,你说我从这个去读,我读出来的是个什么东西。那你说这个入从哪个点去入手呢?我们就可以把这个事儿给他分析明白了。
06:04
啊,你说我先存还是先先读吧。正常的话你看一下啊,我读的就是你存的是不是。能理解吧,就是我读的东西,就是你存的东西,那按按道理来讲,就是我先得存下来,我才能够去读。对吧,所以说我们应该正常什么先去写这个纯就怎么往去纯。能理解吧,好,那如果说你要往red去存的话呢,那我就知道我存哪些东西,而且我存的这个东西从哪来,对吧?那你再来分析,我要去存了,存的话呢,不就相当于我是。从你数据中提取到的这个opposite,我要把它存进去吗?对不对,所以说你就是从这个环节入手,你先得搞明白我从你的数据中是怎么把outside提取出来的,我提取出来以后呢,是个啥玩意儿,然后呢,再把它存进去。对不对啊,因此啊,我们要写的话呢,正常你的逻辑应该是这样子的,就先写它,然后呢再写它,那么你在写它的时候呢,你得先搞明白这个点。
07:08
对吧,先搞明白这个点啊来,所以说呢,你看啊,我们先去写这个纯,那纯的话呢,我们的问题点就是这么几个啊问题啊纯纯的这个oppositeset从哪来对吧?然后呢,Oppositeset的这个结构是什么,对吧?然后呢,存到这个在RA中。怎么存对吧?这几个问题你都得分析明白。好,首先第一个问题,纯的ET从哪来呢?它是从什么从我们的数据中提取出来,对不对,来这个简单啊,就是从什么呀,从消费到的数据中提取出来的。理解吧,那你说我消费到数据在哪?消费到的数据应该在我的主主代码中对不对,所以说我要从我的主代码中把它提取出来,然后呢,给你传到这里面。
08:05
对吧,然后呢,传入到哎,传入到传入到我们的传入到这个方法中啊,传入到该方法中OK吧,好,那这个结构是什么呢?这个结构是什么,这个你就得先知道啊,结构是什么你就先明白啊,就是卡夫卡。诶,卡夫卡中。明白了吧,这个卡夫卡中,然后呢,这个opposite维护的这个结构,这个是你要先知道的,再一个就是什么人家传过来这个结构啊,你明白了这个意思以后呢,我们就会什么从就什么从传入进来到oppositeet中提取关键信息,对吧?你把关键信息提取出来以后,那我就可以往面去存了,对不对?好,那至于这里面怎么存,那你就得看你的结构了,你的结构明白以后呢,你就知道它里面怎么去存了。
09:02
理解吧,来,那我们再把这个分析一下啊,这个提取出来,传入到该方法中,这个怎么提取啊。这个很好提取,来,我现在就给你提取一下啊,它是非常简单的,我们过来来到我们的主代码中,你看了哈,就假设啊,现在我已经从你的卡夫卡中去消费到一波数据了,你能不能看明白,同学们,你消费到数据以后呢,你先不着急做结构的转换啊,因为一转结构你就提取不了了,明白吧,这个地方我们要补代码了啊,补充提取ET,就是从当前消费到的这个这个数据中啊,提取oppositeet。理解吧,这个怎么提呢,来这么去提的啊。听好了啊,这么去提的,拿上这个硫卡夫卡,Re。做什么呀,我们需要去做一个,我想想啊,我们做一个什么操作呀,这个就是一个做一个转换,呃,这个这个过程我不对数据做任何操作啊,就是我们不对不对流中的数据啊,不对流中的数据做任何处理,明白吧,就你的数据该是什么样子的还是什么样子的,我只是从你里面拿一点东西而已啊,所以说这个我们就直接用一个transform操作,就转换的一个操作。
10:27
明白吧,那transform的时候,他给我传过来是个什么东西啊,他传过来是一个RDD。明白吧,那我们的数据呢,都在你的RDD中啊,所以说呢,我们就拿到了这个RDD,然后呢,这个RDD我怎么从它里面去提呢?你从RDD里面提不出来,因为现在这个RDD它是什么格式的呀,它RDD你看这个提示啊,RDD它是这个格式的,这个格式你提取不出来的,我们需要把它转换成一个能够提取opposite的一个格式啊,你要这么去转asence of转成一个叫做这个你没有讲过啊,你直接用哈has opposite ranges转成这个格式。
11:05
你注意了啊,它是一个特质,能明白吧,这个特质下面有一个。就有一个唯一的一个孩子,就是卡不卡RDD,那我告诉你,实际上现在我们拿到的这个东西就是卡不卡RD。但是呢,这个卡不卡RDD中呢,你点过来它是没有那个功能的啊,就是它里面没有定义所谓的什么这个功能,就是我们要用的这个功能啊,在它里面就这个功能。明白吧,所以说我们要什么呀,把它转一下,转成这个什么所谓的,呃,就你转成卡不卡RDD应该也行啊,它毕竟是一个特质嘛,你看一下啊,它是一个特质,然后呢,我的卡不卡RDD呢,是不是混入了这个特质啊同学们。看一下它是不是混入了我们的叫做呃呃在哪呀。是不是混入了这个特质呀,对吧,那你转成卡普卡RDD也行啊,但是一般我就转它了,转它这个比较方便一点啊,来转成它以后呢,它里面就会有一个方法叫做opposite ranges,这就是我们opposite相关的信息。
12:03
能理解吧,来,我把它接收回来。好,这叫opposite ranges,但是大家注意哈,现在我这个代码的执行呢,你要注意一个问题啊,这个最小化的注意一个问题啊,就是呃,我现在给了你一个RDD,但是呢,你对RDD的没做任何操作,你只是从它里面的把这个信息提到了,提到以后我们说了,我要不对数据做任何处理,那我还得把你的RDD的再给你返回回去。就你给我的是个啥东西,我还给你返回个啥东西。能明白我的意思吧,但是呢,我在过程中呢,把你的opposite给他提到了。理不理解,把它提到了啊,提到以后,那这个东西我们就要传到我的这个方法中,就传入到我这个一会儿的这个方法中,那如果你要传入过去的话,那我就问你啊,现在你的这个对象是在你的这个范围内的,你说我现在能用吗?在外面我能用吗?同学们用不着,所以说呢,我要把它什么提取到我的外面,怎么提取到外面呢?
13:01
我在外面定一下,我把它定义出来不就好了吗?对吧,等于空里面我直接给它赋值。这就搞定了。明白了吧,好来,最后把它接收回来啊,2VR好,这就变成了我们的opposite,呃,Range丝,然后呢,Stream好,那如果说诶你对这个流,你看对你的卡不卡,这个流呢,虽然说你流动的数据没有做什么处理,但是你毕竟是经过一层处理的,那你最后的得到的结果是它了,那我们最后啊,再后续再去做操作的时候,你就不能再去使用这个流了啊同学们,你得使用这个流了。明白吧,啊,它是一步一步处理过来的啊,你得使用它了。好吧,那你看一下,现在我就把这个相应的东西呢,就跟他提到了。啊,当然这里面长什么样子的,你还不知道,是不是一会我们再去分析它。
14:00
能听懂吧,好,那么在这个过程中啊,大家还需要去注意一个事儿啊,这个事儿的话呢,呃,我先问你一下哈。这个代码。这个代码在哪里执行,你要先把这个搞明白。来大家回答我啊,这个代码。在哪里执行?啊,同学们,Driver哪里都行。诶,这个。声明说了啊,在driver站执行,其他同学呢?Driver啊,那还行是吧,注意啊,这个代码是在你的driver端执行的,听明白了吧,所以说我就敢放心大胆的在外面定义一个变量,然后呢去接受这个值。
15:04
听清楚了吧,如果说你的这个代码是在你的ex段执行的,那你就要去好好琢磨琢磨你的代码能不能这么去写了。听懂了吧啊。OK吧,来这个问题你自己好好想想啊,如果是在CU端,你应该怎么做?对吧,现在是在driverva端,那还好啊,所以是他是在这个driverva端执行的啊,所以说我就我就敢干,我敢在我的driver端的定义一个变量,然后呢去接受这个结果,因为他们都是在Java端的,那这个问题就不大好吧,行来这是一个问题啊好,那这个我提到以后,那将来我再去存的时候,那我就要想办法把这个东西呀,是不是要给它传到我的。这个方法中了呀,对吧,我给他传过来,就这个玩意我就给你传过来了。那传过来以后呢,你这里面到底有什么东西呢。对吧,那我们就得知道一下我opposite的结构到底是什么样子的,就它里面到底有什么关键的信息,你能听懂,我知道它的关键信息以后呢,我就知道我要用什么,我知道我要用什么呢,我就可以从它里面去提取什么,我就可以把什么提取出来了,提取出来以后呢,那你提取出来以后呢,你就知道你有哪些关键的信息要去维护了,那你就可以去分析一下在red里面我应该怎么去存了。
16:19
对吧,同学们啊,行,来这个,呃,先停一下吧,我们这个讲了不少了啊,先停一下啊。
我来说两句