00:00
好,接下来呢,我们首先导入这个CP的依赖可以吧,啊把这个依赖。添加进来啊,因为我们要用到这个CP了,所以呢,第一步得添加依赖,呃,这是fli依赖啊,所以呢,我还是把这个fli放在一起。我把茯苓相关的一代放在一起啊。诶,这个地方怎么少了一个。见过了。这个文档当中少了一个进括号是吗?啊,这是当时应该粘进来,最后不小心把它删掉了,大家注意一下啊,这少了一个监控号,你看一下你们那边有没有少啊,刚才粘过来报错嘛,对吧,应该是我粘过来之后不小心光标在这儿,诶碰到这个。碰到这个删除键了,对吧,碰到删除键了,把这个删掉了啊,正常我粘过来不可能少了对吧?好,这个注意一下,你粘过来,刚才看报错嘛,对吧,报错就知道了,好接下来呢,我们。把这个类创建一下,我们把这个思路写一下啊。
01:06
DWD上。在那边。好,首先写我们的思路,PSM。对吧,啊,要这个数据。呃,第一步。获取。执行。环境对吧,第二步。啊,读取。卡夫卡叫页面日志主题数据创建流对吧?好,那接下来呢。第三步啊,按照我们所写,我们读取完数据之后,是不是要KPI呀,对吧,那我们这个还别着急KPI,我们先按照这个数据呢,把它转成结算对象,因为这样更好处理一点,对吧,将。转化为。
02:00
杰森。对象好,那第四步。对吧,第四步啊。嗯,转为接送对象以后呢,按照mid。分组,那我们就准备好了这个主流接下来呢。定义。CP的。模式序列。啊,模式训练对吧,就是我们那个规则,我们要匹配第一个。上一条页面文档,第二条数据,上一条页面文档对吧,第三个点就是加了一个微信啊,加个超时时间对吧,这样的话状态编程加。窗口都有了啊好,那接下来呢,第六步。将模式序列作用到流上。第七步。提取时间。
03:00
提取时间啊,这边呢,包括两个。匹配。上的。事件。我们需要对吧,以及什么呢,超时事件啊,那这个超事件呢,也是我们要的。啊,也是我们要的对吧,好,那么。这个合并。两种事件。对吧,合并起来以后呢,将数据。写到卡不卡。最后。第十步,启动任务。对好,这是我们的内容啊,那接下来呢,我们把前面的来写一下啊第一个。这个直接。过来啊。好,第二个它也是读取卡夫卡这个日志数据,对吧,所以呢,我就简单一点,直接从这拿啊,把这个拿过来。
04:06
但是呢,要改一改,改什么。要改的是这个对吧,如果说不改他那完了,那你俩消费的数据一人一半了,对吧,所以呢,我们把这个拿过来啊,我们就拿这么多就行了,叫用的降对吧,用户跳出的一个detail。这个你粘归粘啊,但是呢,消费者组要改啊,你不要你不要粘了之后你消费者组不改那不行对吧?好,那下来呢,将每行数据转化为切算对象,这个呢,咱们样写啊卡DS点。Map,我就不直接写方法调用的方式,我先给他写个这个啊来对吧,呃,杰森。点pass object,然后呢来对吧,但实际上呢,可以简写方法调用方式对吧,这样的方式呢,我们就得到了,可以用这个加V得到一个。
05:00
街上。Object。对吧?呃,接下来呢,按照m mad分组,这个东西呢,我们也写过很多次了。是一个阶层对吧,先获取咱的。Comments的。然后获取咱的。Ma子的对吧,好,这样的话呢,我们就得到了一个监控。啊,得到了一个监控流对吧,好,这一步呢,是我们最核心的一步啊,等会儿我们来写你前面呢,判断我们要快速的。搞定对吧。呃,那么我们CD的依赖呢,已经导进来了,接下来呢,我们要定义这个模式序列啊,大家呢。为什么要消费者组不一样?嗯,这个我把它摘出来啊。就是你,你。你看啊。你现在是两个程序啊。有同学问到这个问题,我们就说一下,这是两个程序嘛,一个是UV,一个是U界,对吧,那我们两个人消费的是不是同一个主题啊。
06:09
看啊。我们呢同一个主题,然后呢有两个人消费。啊。如果说你的消费者组不同,比如说你是G1组对吧,你是G2组,两个消费者组不同,就ID嘛,对吧,Group ID不同,那么你俩呢,这边来个1234啊。来个1234,假如说两个分区,两个分区啊这样,呃,我们这个呢,有两个分区对吧,你呢,1234,假如按人群给进来的可以吧,好那么你呢,消费大数据是一三。二四你呢,也是1324啊。如果说如果说这是两个消费者组不同,对吧,你你们俩呢,消费到的都是全量的数据,那如果说你消费者组相同。
07:01
对吧,还是一样的一二。三四。然后。你消如果说你是这一组,你也是这一组,你消费到什么呢?你消费一三,你消费24,因为你负责一个分区了,你负责一个分区了,按分区划分的。啊,如果说你是同一个组的,如特别的,如果说你只有一个分区啊,更关键的在于,假如说我1234对吧,我我这个主题只有一个分区,你呢,有两个消费者。你是第一组,你是G2组,那没问题,你俩都是1234,关键问题,如果你也是第一组,那么他可能先启动对吧,1234这边没有数据。没有数据。对呀,同一个组只会消费到一份数据,没毛病,OK吧,好这个呢,好,那接下来呢,我们留已经准备好了啊,那咱们要写的呢,就是这个。模式序列啊依赖呢,已经导进来了,那我们模式序列的规则我们已经说过了,第一个事件。
08:04
上一条为呢,第二个事件,他们紧挨着得用ne,对吧,因为在我们的模式序列里边呢,它有这个严格近邻。宽松近邻,非确定性宽松近邻,还记得吗?这些个名词。对吧,那我们肯定要用严格经理,他俩必须得紧挨着,所以呢,我们用next啊,那我们来定义一下就是pattern。注意用CP啊,点begin一个开头对吧,这里边呢,我们写Jason object,因为咱们的数据流是JA object对吧?好,那这边呢,我们写一个。啊,它以这个start开始啊,然后呢,我们写一个where条件过滤嘛。好,咱们要的是什么?咱们要的是上一跳页面ID。等于那的数据吧,好,那我们取出上一条页面IDY6点。Get object首先呢,它在配置里对吧,接下来get,接下来呢,我们是叫last。
09:04
配置。ID对吧,那我们要它等于那呢,那么就写它等于,那过滤条件对吧?将下来第二个事件点next,严格近邻啊,那比如说我们这个呢,就叫next是吧,而同样的点will,那由于你们俩一样,我呢直接把它拿过来。对吧,点费用。两个都是要上一条页面ID等于那的,接下来呢,写第三个就是微,那微信里边呢要一个。Window time对吧?啊时间窗口的时间看啊,它里面呢,给的是什么窗口时间,好,那接下来呢,窗口时间,那我们就给一个碳。Second,我们给个十秒可以吧,给个十秒好,那回过头来,我们发现了一个问题。这个地方呢,咱们。
10:00
是不是说将这个。开一个十秒窗口,为了解决乱序数据问题啊,那既然我们想解决乱序数据问题,是不是应该用这个。世界时间。对吧,用事件时间不能有处理时间,但是呢,前面我根本没有提事件时间吧,那怎么办呢?我们在这儿来提一下对吧,在这个位置啊好,那我们呢,在这边加一个提取事件。时间。And按照m ma分组对吧?在这边我们加一下就好了,Sign。Time step and what marks。对吧,好,那这边呢,我的strange呃。那本身我们就十秒,我们就不需要这个,我们也可以加上这个乱序,对吧,假如说呢,我们乱续两秒啊叫bounded out of out对吧,这个地方是杰森object。好,那我们的duration。然后呢,我们给他一个两秒的时间点。又一个civilization的一个time step对吧?好,这里边呢,我们的数据实现element。
11:04
Get了。然后呢,获取TS对吧,这样写一下,好,那我有个问题问大家啊,你看这个流呢,在这儿,我在这个中间去穿插,我为什么不在后面写,我先K再去提取。不行吗?为什么我非得在里边穿插的鞋?有没有同学知道这个点?就是提取时间戳,不是说任何地方都可以哈,不是任何地方都可以对吧,这个呢,我们就放中间写啊。就不能写在后面,我就告诉你,就不能写在后面对吧,为什么,你能告诉我吗。有很多地方都这样。有很多的时候都这样。你不能写在这个后面。
12:06
有没有人能告诉我什么原因?啊,没有人知道吗?就是你们提取时间中随便写是吧,想写哪写哪。就是你注意啊。水印在KPI之前,然后呢?为什么不能在K后呢?你你,你把现象描述为,我的问题是为什么不能在K后广播?嗯,我在K盘后就不是广播吗?我告诉你啊,在K盘后他照样也是广播。在K后,它也是广播。就是你数据做K跟我水印有什么关系呢。不知道是吧,来我给你调用一下你就清楚了。
13:06
我里边不写了。你看。你明白吗?不是什么广播。不能写在KY后面是什么什么原因啊。我就写到这儿,我里边就不写了。你观察一下这个。什么原因啊?还看不出来吗?我就给你写到这儿。理论上说应该就能发现这个原因了啊。还没发现吗?范型。
14:01
对对了,胡总说的没毛病啊,你看。你在监控流提取时间戳以后,你看啊,我在中间提取时间戳,再去K,它是监控流。如果说你在监控流后面提取时间窗,它这个流的类型就变了。假如说你要开窗对吧,你拿这个去开窗,你拿着kid。点你可以开这个窗口对吧,但是如果说你拿着它呢。你拿着它去开窗呢?点window。你只能开window。你只有WINDOW2调用,因为它就变成了一个什么普通的数据流了,不是监控流,听懂对吧,所以KB后面不要瞎加代码。不要随便加代码。听懂。不能随便加代码。好吧。好,那我们就得到了一个这个pattern对吧,得到了一个规则,接下来呢,我们要将这个。
15:05
放在这个流上对吧,当然这个规则,嗯,大家呢,等于这个CAD啊,就是实在是忘了太多了,几乎都忘了对吧,那我们这边呢,我们可以再扩展一点啊,呃,也不是扩展嘛,就是你们之前学的东西,但是你忘了对吧,我就多说一句啊。那这两个条件是不是完全一样啊?这两个条件是不是完全一样啊?这两个条件既然完全一样,好像在CP里边有一个什么模式可以来代替啊?啊,我看我记,我还对大家有保留一丝丝的信任啊,我觉得班上呢,应该有一些同学还是记得的,对吧,记得一点东西的,所以呢,我还是问一下,我就不直接说了啊,就是当我们这个条件判断条件完全一样的时候,好像在CAD里边有一个什么东西可以代替是不是?
16:00
哎,对了,方总。啊,Times,对了啊,循环模式啊,循环模式啊,没没毛病啊,嗯,所以说呢,我觉得应该还是有一些同学能够记得一点东西的,对吧,那循环模式怎么写呢?就patternon啊,点begin。然后呢,杰森object啊,你不记得不代表所有人都不记得对吧?啊,所以呢,我还是要说一说啊,然后呢,这个味道我就我就摘一下吧,啊,这个还挺多的啊。站在这,然后接下来呢,我们用一个times对吧,TIMES2。哎哎,嘴上说着啊,然后自己手很诚实的写了个一对吧,那不行啊,再加一个微啊,然后呢,这个他。点second。十秒啊,可以这样写对吧,但是我想问大家,这样他对吗?这样它等价于这个吗?这两个现在等价吗?
17:14
我用了循环模式。啊,不等价,问题出在哪?问题出在哪儿?啊,加上严格连续对了,这这个东西啊,这个东西默认是什么。默认是。宽松领是不是?它默认呢是宽松敬礼啊,如果说呢,你想严格敬礼,你得加。对吧,这个是严格禁音。呃,你加了这个东西,它才相当于是谁呢?是next,而这个呢,相当于什么?
18:03
这个就是。你直接这样写啊,就不加这个对吧,它相当于是这个followed by跟着就行了,不需要next啊,那比如说我next对吧,Next必须是下一个啊,我框后面必须跟着框,那这个就匹配不出来,如果我用next。这个就不行,对吧,如果说呢,我用的是followed back,诶这个呢,可以匹配到对吧,一个是严格鉴定,一个宽松定理,哎,这边我改为了nice对吧,好,这个加了。他。这两个。才是等价的。啊,才是等价的对吧,好,那我们保留一个就够了啊,这个我们注入掉。这个呢,就跟大家聊一下,诶,他在我们的CP定义模式序列里边呢,还有这个。循环模式。啊,还有这个循环模式,OK吧,好,那接下来将这个模式序列作用到流上,这一步很简单啊,呃,CP。
19:02
点pattern咱们的流呢,流是什么?是这个监控流吧,这个啊。第一个放流,第二个呢放pattern,哎,这样的话我们就得到了一个规则流叫pattern。对吧,我们又得到了一个规则流啊,接下来我们要提取的一个事件来看啊,我们现在有微有超事件select,对吧?来。这里面呢,我们要用到哪一个用到它。三个参数,第一个。Timeout t是一个out tug测输出流的标记,对吧?第二个位置是一个pattern timeout function式提取超时事间的,第三个参数叫patternon select方式提取匹配上的时间的,这跟我们之前就关联起来了,对吧?我们呢,直接说超时事件是放到测输出流的,诶就体现在这儿对吧?这是一个auto。啊,那好,那我们在外面呢,要定义一个。
20:03
Out,然后里面呢,我们放three啊,因为最后呢,我们要把数据输出嘛,输出到卡夫卡对吧,我们就直接写three得了啊,这个地方呢,我们写type out。Time out对吧?好,那第一个参数它就要这个,第二个参数呢,它要一个pattern timeout function对吧?啊好,那第三个要pattern select function,然后这地方呢,我们也写词B啊,因为最后呢,两个流合并对吧。好,当然我们怎么说的,对于这个超时数据而言。它呢,你看我们匹配上了一个。下一个呢,没来。对吧,第一个数据匹配上了,那这里边儿呢,我们要的是不是就是第一个数据啊。是不是要的就是第一个数据,要的就是他吧,那。
21:00
匹配上的呢,就是哎,第一个数据是上一条文档,第二个数据呢,也是上一条文档,那我们要的是不是还是第一个数据啊。不管怎么样,我们要的是不是都是第一个数据,这个有没有问题?思考一下,没有问题,给我扣一好吧。就无论是超时数据。还是匹配上的数据,我们是不是都要的是第一个呀。好,那接下来我们来取第一个啊呃,它的数据呢,第二个是一个时间对吧,是一个时间啊呃,那不用管这个数据呢,它是一个map,看见没。他为什么是map呢?因为我们有什么。Start。Next注意这个东西呢,就是作为map的key。啊,而我们的数据就是value。因为你有start,有next对吧?好,那我们要取第一个事件,肯定从web里边获取start,但是获取start发现它又是一个集合,那大家能不能给我解释一下它为什么是一个集合呢?
22:09
对吧,这个K我已经告诉你了,它对应的呢,是刚才我们在代码里面所写的start next那个东西,那为什么它还是一个集合呢?你这不是一个事件吗?我告诉你的是这个start对应我们匹配上的事件,那个对应匹配事件。那为什么它是一个集合呢?这个该怎么理解呢?它这个集合该怎么理解呢。
23:02
是因为不是。跟KY有什么关系啊?你还能把不同的K放在一起吗?那你怎么取啊?他肯定是一个K一个map啊,就是他在外层还有一个K,就是你的mid,你懂吧。可以放一个元素,也可以放多个,对呀,它问题为什么放多个呢?我这不只有一个吗?他为什么要放多个呢。那他写的是一个list,那肯定是放多个吗?那还用说吗?对吧,那问题就是为什么多个。这多个哪来的对吧,那明明是一个,那那哪来的多个呢。
24:00
啊,哪来的多个。这个不知道啊。那刚才咱们这个不白聊了吗。非确定连续,非确定连续它也是一个呀,不对呀,循环模式呀。循环模式。因为我们有循环模式,你看啊,这个地方我直接写了一个TIMES2,它是不是对应的有两个事件,但是我K只有一个,看见没。是循环模式啊。
25:00
你非确定性宽松定理你写follow,你follow对应的不还是一个数据吗?他怎么会对多个呢,对吧,你要注意啊,它因为有。循环模式,你看这个K就一个,但是事件呢有两个,因为他考虑到未来有的人可能会写这个循环模式,所以呢,人家在封装这个内容的时候,封装呢就是一个集合。而我们只有一个对吧,那简单,我们可以那样提取map点。Get。Stop。点。Gale。对吧,然后呢,这是杰森点。To Jason。对吧,这样的话我们就取出来第一个,因为我们只有一个,所以它一定是零对吧,那第二个数据咱们也取第一个,所以呢,跟他一样。这个是集合,原因在于循环模式啊,原因是在于循环模式OK吧,就在于循环模式好这块呢,就。
26:05
啊,那这个呢,我们就得到了一个正常的输出对吧?CDS,好,那我们要提取两个事件,第一个呢,正常的提取到了,然后呢,点get set out对吧,把这个timeout t传进去啊这个东西呢,咱们就得到一个什么叫。Time out。DS。对吧,啊,两个流一个呢是正常的。输出一个呢,是测输出流的输出对吧,合并两个事件啊,那合并起来呃CS.unit啊,两个都是three嘛,所以呢,我们就直接合并就好了,然后呢,Timeout。得到一个UN。对吧,啊最后呢,写到卡夫卡,写到卡发之前呢,我们做个打印,为了区分一下,我打印呢,这个打印啊,我不打印那个uns,我对这个打印。对吧,我对它进行打印,因为这样的话,我们看的未来看得更清楚一点,他到底是哪个地方输出的,对吧。
27:14
Timeout啊,然后呢,写到卡夫卡,那这个主题呢,我就拿一下啊。主题名称。在这。好,接下来呢,我们把这个数据写到卡不卡叫uns点。Had think对吧,My KA YouTube get卡的produce,然后呢?啊,最后呢,这一步别漏了。还是一样的,咱们呢,把这个。拿过来。作为我们的任务名称对吧,那到这个为止呢,我们就要整个的都。搞定了啊。
我来说两句