00:00
接下来我们就给大家讲一讲flink里边cep这个库到底是什么东西,然后怎么样去用它主要的一些内容啊,首先我们先了解一下什么是cep cp是个缩写了,它是英文单词缩写,哪哪三个英文单词呢,是complex event processing,翻译过来就是复杂事件处理啊,所以它就是应对我们这种比较复杂的对吧?有这个逻辑关系对吧,谁前谁后怎么样的这样的一些关系,主要就是处理这件事情的,所以它是flink里边实现的复杂事件处理的这样的一个库,当然它的抽象级别就会比较高,就理论上我们在底层可以自定义用process方式,用这个,呃,状态编程对吧,设置定时器,其实它这些所有的这些功能我们都可以自己去实现,但自己实现可能就会非常非常复杂,所以往往遇到类似问题的时候,我们可能就需要用这个CP去做一个实现了。
01:00
那CP它是用来干什么的呢?它给我们提供了一个强大的超能力啊,什么样的超能力呢?就是所谓的处理复杂事件,什么什么样的是复杂事件呢?允许在无休止的事件流当中,这来的是事件流,而且是完全是无限的,对吧?无穷无尽的允许在这里边让我们去检测事件的模式。就是我们可以自己定义出来哪些事件组合在一起,他们符合某种模式,我们可以把符合这种模式的那些事件单独筛出来,从流里边筛出来,然后去做处理。所以这种方式就可以让我们有机会掌握数据当中我们最关心的最重要的那一部分信息,对吧?啊,这是它的一个主要目的,那这个怎么样去检测事件模式呢?它其实就要定义一个或者多个由简单事件构成的事件流,那么它就会可以通过一定的规则去做匹配,有点像模式匹配的那个概念啊,就是我们定义好模式之后,定义好这个规则之后,就可以把简单的事件在流里边匹配出来。
02:14
然后我们就可以做操作,输出我们想要的结果啊,这个概念好像还是有点绕,我们具体来看一看吧,大家看一看,呃,整体来讲CP有哪些特点,或者说哪些重要的要素呢?首先它的目标是什么?目标就是从有序的这个简单事件流里边,想要发现发现一些高阶的特征,就从事件本身这个事件流里边提取出它们互相之间有关联的一些特征,比方说什么什么特征呢?大家看这里边是我的一个输入一组事件对吧?啊,一个一个输进来了,那这里边啊,但是大家直观这么看的话,它上下分成两组对吧?呃,有点像KBY之后的那个状态,这里边的事件有什么特点呢?我想要选出一个长方形后边紧跟着一个圆圈这样的一个事件类型。
03:10
那大家想这是不是就有点儿像我们说的连续两次登录失败对不对,这是不是就是登录失败之后,紧跟着又一次登录失败,中间不能有success对吧。这就是量,类似于这样的一个规则,那么它的输入是什么呢?输入当然就是我们的事件流,它里边是由一个或多个简单事件构成,我们平常处理的那个事件流是不是都是这样的情况啊,对吧?都是一个一个简单的事件进来的,然后接下来呢?处理的过程其实就是要识别它们之间的内在联系,如果符合某种规则,比方说它后面是它,对吧,这样就把它构成一个复杂事件,我们所谓的这个复杂事件处理它这样定义出来的一个模式,它就构成构成了一个复杂事件。最后的输出,那又是什么呢?
04:00
大家看这是不是模式匹配这种感觉啊,对吧,定义了一个规则,定义了一个模式,然后应用到这个输入流上面,就把对应的这些是不是就全筛选全取出来了。对吧,这里边是不是有这样的一组啊,这里边有这样的一组,我们输出的时候就单独的把它这样的东西过滤出来,筛选出来去做处理,这就是CP的一个主要的处理流程和特点。然后接下来给大家具体的讲讲这个模式和patternon API啊呃,这里边我们所谓这个处理事件的这个规则,就是你怎么样去定义事件之间的关系,到底是按什么规则去把它们绑定在一起,把它们叫做一个复杂事件。这个规则就叫做模式,叫做pattern。那所以CP里边呢,就针对这样的pattern给我们定义了所谓的pattern API,我们可以调用pattern API去对输入流里面的数据进行这个复杂事件的定义,然后呢,把它应用到对应的这个流上,然后提取出我们想要的这种复杂事件的序列。
05:09
我们怎么说还是有点奇怪,看看代码吧,先直观的有一个印象啊,这部分不要求大家直接就搞清楚,他就是完全是干什么事情的啊,大家先有一个概念,整体来讲是分成,分成哪几部分呢?啊,大家看比较高级的这个API看起来就可读性更好了,对吧?啊,大家是不是觉得这个过程有点跟CQ,或者说跟这个table API之类的东西有点接近啊,啊所以大家看这个它是怎么样抽象的啊,首先是要定义一个pattern。这个pattern就是我们的模式对不对,这个模式是什么呢?大家看啊,就是pattern.begin begin,然后后面这个start这个字符串,这相当于是当前的名称,对不对,给一个名称。那么begin是什么呢?后面有条件啊,Where什么等于什么,然后后边继续点next。
06:04
Next是不是表示接下来发生什么事件啊,对吧,然后又给了一个名字叫middle,然后中间又有各种各样的条件,对不对,然后接下来又是followed by,那这个就是又是后面定义后续的一个事件,然后最后也是有各种各样的条件,所以大家看就是把这种不同的条件,不同的事件,这个规则组合在一起,这就是一个pet。那么大家就会看到它提取出来的是不是就是复杂事件啊,对吧,就相当于是几个事件连在一起,就串在一起,捆绑在一起,然后表示某种特定的事件序列。那这个Python定义好之后怎么样去。应用呢,简单的方法就是调CP.python方法,把我们的data stream输入的这个流放进来,然后后边把patternon放进来,就可以得到一个patternon stream,这就是把这个模式应用到了我们的这个输入流上面,这是第二步,然后第三步就是。
07:11
是不是就可以从这个流里边提取出我们想要的符合我们定义规则的那些复杂事件了啊,就可以提取出来了,就比方说这里边的提取方法是什么呢?直接t stream,再去调一个select的方法啊,当然这里边这个函数大家知道可能就又要自定义了,对吧,又是一个函数类之类的东西,最后又得到了一个data stream,这就是整个调用的过程。先有一个概念啊,然后接下来我们看一看这个Python API里边的一些具体的概念啊,这就讲的会越来越具体了,首先在patternon API里边,这个所谓的patternon啊,所谓的模式分成两大,呃三大类吧,基本来讲是个体模式和组合模式。然后另外呢,还可以把这个模式序列嵌套在条件,就是作为条件嵌套在个体模式里边,他们又可以作为一个模式组来用啊,这个可能稍微少见一点,比较常见的就是个体模式和组合模式,什么叫个体模式呢?
08:16
就大家看前面我们定义的那个start什么什么,然后后面跟着它条件对吧?呃,这个东西就叫做个体模式,就是组成复杂规则的每一个单独的模式定义单独的那个事件选取的那个条件的定义,对吧?这个就叫做一个个体模式,而组合模式就是。前面我们定义的啊,Start的时候是什么对吧?Begin的时候是什么?然后什么?Nexts是什么?Followed by又是什么?所有的单一的这些条件都组合起来,所有的模式合在一起就变成了一个组合模式,有时候也会把它叫做模式序列,这里大家需要注意的一点就是一个模式序列或者叫组合模式必须以什么开始啊?
09:01
啊,必须以begin开始,那这个是必须的,对吧,打头的时候必须是begin限定好的啊啊,那那大家光这么看的话,还是通过这个概念其实已经看到了,大家看这里边我们定义的patternython其实是什么呀?对,就是一个模式序列对不对,一般用的时候就是用一个模式序列去匹配我们这里边的复杂事件的,那么这里边定义的时候,前面这个start,这里是begin start,这就是一个。个体模式,对下边这个nes这个是不是又是一个个体模式啊啊,他们三个串在一起就是一个模式序列,就是我们的一个,呃,这里所说的组合模式。好,然后接下来再给大家介绍一个比较重要,就是个体模式里边比较重要的一个概念,个体模式里边包括什么样的模式呢?又包括什么样的模式呢?包括所谓的单利single模式和循环模式啊,顾名思义就是单立模式是什么?就是我们定义好那个状态之后,就就筛选一次,对吧?那循环模式是不是要反复筛选对吧?你可以是这个发生一次,再发生一次,再发生一次这样的一个过程,所以简单来讲就是单立模式只接收一个时间,而循环模式是接接收多个。
10:19
这里边既然提到了循环模式,就必须要提出一个概念叫量词模式,里边的量词是什么呢?就是所谓的我可以在一个模式后面加。点times是不是可以表示它发生的次数,或者还可以什么点one or more是不是可以指定对是不是一次或多次发生这样的一个规则啊,所以这种东西就都叫做量次。大家可以具体看一看这几个例子啊,比方说start.times4,这表示什么?对,这表示我们匹配的就是它要循环出现四次对吧?四连续出现四次的这种情况匹配出来,然后如果要是start.times4后面再加一个optional呢?这表示什么呢?大家知道optional可选的这个意思对吧?所以它的意思就是要不就没有。
11:14
要不循环出现四次对不对啊这样的一个。然后是start还可以,TIMES24这代表什么呢?对,那是不是就是二到四四都可以啊,234都可以啊,其他的情况不行。然后还可以后面再加一个greedy greedy是什么?对贪心贪婪那个意思,所以它会尽可能多的重复匹配,也就是对大家会想到那就是相当于什么,就是你如果出现一种情况,前面已经匹配了三次对吧,那后面如果要能匹配上四次的时候,是不是他会尽量去匹配这个,呃,就是尽量把我们这个重复利用对吧?能匹配一次三次也能匹配一次四次都都可以去匹配上。后边还有这个one or比较好理解了,就是一次或者多次,另外再给大家看一个组合啊,可以干什么呢?One times or more,除了one or more之之外,还可以times or more。二、这个代表什么?
12:12
两次或多次对吧,就是两次呃以上,然后它还可以点optional,再点greedy,这表示什么呀?对整个的表示就是既然optional是不是前面是可以没有啊,所以这里它的表示的其实就是两次或多次或者没有也行,对不对,零次也行,然后还尽可能多的重复去匹配。这就是这个量词的一些含义。然后有了量词之后,其实就可以指定循环次数,这就相当于是一个循环模式了,对吧?呃,除了量词之外,个体模式里边还有另外重要的一个概念,就是条件,所谓的条件啊啊,那么condition这个大家很容易理解了,那其实就是后面可以去加一个where表示。
13:02
根据什么样的一个判断条件,作为我们是否接受这个当前的这个数据,这个事件进入我们当前的这个事件序列,对不对,对吧,相当于这个filter的过程啊,有点也有点像我们这个写C写table API的时候的这个调用对不对,Select啊啊那么这里边大家注意啊,条件CP里边个体模式的这个条件主要用什么来定义呢?啊,最主要当然就是where了,另外还有什么,还有or和until也都属于这个个体。个体模式里边的条件。具体来讲的话,首先是简单条件,条件又分成这么几种,简单条件非常简单,就是VR对不对?VR里边传一个函数,那我就知道该怎么去选了,或者我们直接传一个,呃,一个布尔类型对吧?一个字段等于什么或者不等于什么,这些都可以。然后接下来有多个VR条件的时候,是不是就可以把它做一个组合条件啊啊,那组合的关系就有,就有and,就有or啊,大家想一想,如果是R的话,这里边就有一个点R,这样的方法大家看就是前面一个where,后边这个R是不是相当于也是一个where啊,只不过是用点R,就表示两者之间是货的关系。
14:20
那如果与的关系呢?那有同学说与的关系点and,不用and,与的话你就where.where就完了,对吧?啊就是相当于就是直接就是叠加的条件与的这样的选择关系好,另外还有一个叫终止条件,终止条件就是我们所说的until了。呃,Until它一般是用在什么地方呢?就是前面如果我们用了one or more,或者more还加了optional的话,一般都建议后边加一个终止条件until,为什么呢?因为大家想这个你要是one or more,或者还还optional就是可有可无,对吧?在这个过程当中相当于是什么?对,没有终点一直在检测你这个过程当中是不是要要去缓存的,大家想想你这个过程当中没有终点的时候,前面的事件你不确定它是否要去丢掉,那是不是必须都缓存下来,都得保存成状态对吧?那这个过程很容易,你到后面就跑着把状态就撑爆了,所以一般情况如果用到了这些的话,这些量词的话,一般要指定until作为一个终终止条件,方便去清理状态。
15:29
呃,除了这些之外呢,还有一个更加复杂一点的啊,呃,这个就是看情况去用,还允许我们用一个所谓的迭代条件,迭代条件就很强大了,它可以对模式之前所有接收到的事件,获取到所有接收到的事件,然后去进行处理。它的调用简单来讲是什么呢?还是VR,但是VR里边可以传一个什么,大家看这个函数里面带了一个什么东西。Ctx是不是上下文啊,把上下文直接就拿到了,这个上下文里面可以调什么呢。
16:00
可以get events for pat,这里边可以传一个这个字符串,这个字符串是什么?大家还记得前面我们那个begin的时候给一个字符串begin,对吧,那个next的时候给一个字符串middle,那个是不是代表我们当前个体模式的那个名称啊,对吧?那那一条个体模式的名称,它可以直接按照这个名称把符合条件的那个事件之前匹配好那个事件从状态里边都拿出来。在这里边再去做判断,再去做使用,所以这个就比较强大,但是可能也都是特别复杂的应用场景才会去调用这个方法啊,大家一般情况可能只用前面的几种也就够了。
我来说两句