00:00
但我们已经知道了flink运行时的架构,而且也知道了作业提交和这个运行的整体流程,那接下来我们要思考几个比较严肃的问题,其实也是比较好玩的问题。我们已经知道他怎么提交了,但是提交上来的这个代码啊,我们一开始原始的那个代码,它是怎么变成最后要执行的任务的呢。我们写的编写的一个流处理程序,到底最后会包含多少个任务呢?这个问题其实本身应该是由谁来思考啊,那这个问题其实它应该是由job manager来思考。因为他需要把这个。所有的呃,作业拆解开,拆解成所有的任务,可执行的任务,然后最后他要向那个资源管理区去申请slot,对不对啊,所以这个drop and1定要把这些事情全部搞清楚,所以还有一个问题,就是说最终要执行这些任务,到底要占用多少个slot呢?啊,所以大家现在的角色就是我们临时的变成了一个manager,一开始我接收到的啊,是一个整体的一个作业,是由这个原始的原代码,Java或者scla代码转换过来的一个东西,一个抓包啊,那接下来我到底是怎么样能把它解析出来,拆解成最终可执行的任务,然后我又到底需要多少资源呢?这就是作为一个经理,作为一个管事儿的人。
01:22
想想要做一个项目的时候需要去考虑的问题。好,那这几个问题我们给大家也是一些in运行时的重要概念。首先。我们先了解一下程序和数据流啊,那这这个就是因为我们最先写的编写出来的是一段Java代码嘛,那这一段代码我们最后要变成可执行的任务,它其实是有几步转换过程的,首先我们看到啊,我们先分析一下一个丁可流处理程序。大家其实也看到了,就是在我们之前写的代码里边啊。
02:02
这个代码里边整体来讲其实可以分成三步啊,当然你如果算上前面这个的话,那就四步啊,就是第一步先创建一个执行环境,然后具体的操作,具体处理的流程,其实就三步,哪三步呢?首先先读取一个数据,读取数据源。然后接下来呢,这个数据源就在这儿各做各种操作啊,你可以这个什么map flat map对吧?啊,可以这个什么K之后sum啊,可以可以各种给他转换,最后得到一个计算结果,再做一个输出啊,当然这里我们是打印输出,你如果想输出到一些外部系统,输出到这个数据库里边,输出到存储系统都是可以的啊,所以整体来讲,我们看这个程序不可以把它分为三大部分。一部分叫做造。读取数据源,然后第二部分叫做transform,那就是利用各种各样的我们所谓的那个算子operator,大家还记得源码里面把那个叫做operator,对吧?利用利用各种各样的算子定义一些操作任务,对数据进行加工处理。
03:09
啊,之前我们介绍接触到的是这个map flat map,还有这个就是聚合啊,Sum之类的,那其实大家看这里还可以干什么,还可以开窗户啊,啊,Window啊都可以做这些操作,然后另外还有一部分就是所谓的SK啊,Think大家知道有这个下沉的意思,那source是读取数据源,那think下沉呢,其实就是把数据再写到外部系统去。他就是负责我们的输出。整体这个三部分非常的明确,就是输入转换输出,这就是link流处理程序的架构,那么基于这样的一个架构,我们可以把它做什么样的转换呢?啊,那其实它一转换就可以转换成一个像一个流水线一样的一张图,对不对啊,所以这个图就叫做逻辑数据流,所谓的data flow。
04:03
Data flow是一个非常重要的概念啊,大家可能听过这个谷歌有一篇著名的论文,大数据方面的论文,就是专门讲这个data flow flink其实就是基于谷歌那篇论文的思想去做的设计啊,所以它底层其实就是这样的一个所谓的数据流data flow,那data到底是个啥呢?它其实就有点像我们所谓的dag啊,这Spark里边大家想你分析各种各样的这个操作啊,任务的这个之间,他们之间的这个关联关系的时候,最后不也是画出画出来一张这个有效无环图吗?啊,所以flink这里边也是一样的一个dag,那么这个dag的特点就是都以一个或多个多个S开始,S任务开始,一个或多个think任务结束。这里边多个就是说我们。一一段流处理程序啊,一个作业你可以有多个数据源呀,啊之后我们多个数据源读进来之后可以合并在一起吧,然后最后输出也不一定只是单一的输出到一个地方啊,我可以输出到两个地方啊,这都是完全可以的。
05:05
所以。大家可以看到在flink的这种架构里边啊,包括它程序的这个API设计里边,每一个API其实就对应着我们这里的一步操作。读取数据源,那就是a source啊,大家看这里边是a source,如果我们前面直接读取文本。就是文本文件的话,那就是追text file,如果是读取文本流的话,那就是socket text file对吧?呃,Socket text stream,呃,所以当前的这个状态其实都是一个所谓的读取数据源的算子,那最后的这个输出呢,我们调的是print,那其实更加一般化的输出叫a think。它也是一个固定的输出算子,那当然中间各种各样的转换,那就跟我们要做的转换需求有关了啊,有不同的命名,你可以map,可以呃,K,然后可以sum,对吧,可以可以flat map,所有的这些都可以做,所以大家会发现啊,简单来看的话,那其实就是每一个算子。
06:08
就是我们程序里边的一个换操作嘛,那来看的话,诶,点Fla map前面点OK text text stream,这是一个,这是一个这个对应的data flow里边的一个算子,对吧,这是一个source,然后你最后的print,那这是对应的里边一个一个S,那Fla map啊对应一个Fla map操作,那后边这个k by sum,这对应着一个就是K之后聚合的操作,对吧?所以基本上就是每一个点这样的一个方法调用。大家可以都可以认为它对应着一个operator,对应着一个操作,但是要注意啊,不是所有的点方法这个一步调用都对应着一个操作,这为什么呢?因为你看这个,它最后返回一个single output stream operator,那说明它是一个操作。算子嘛,Operator嘛,你像前面这个Fla map,它也返回是single output dream operator,哎,这个没毛病,但是像我们这里的这个K。
07:09
哎,大家可以看到gaby,它返回的是一个kid stream。它并不是一个operator,所以它其实表示的什么呢?呃,我们知道它只是指定了当前的一个key嘛,只是案件分组嘛,具体到我们这个流流数据流的处理上,它其实是指定了数据一个。分区的策略啊,所以说它并不是对数据,针对数据进行了转换处理。它并不是真正的算子。后面我们提到的话,还会再给大家专门去说啊,所以大家要区分就是哪些是算子,哪些不是算子。呃,既然讲到这儿,那那这个可以给大家啊,之前我们那个集群还是跑起来啊,大家再重新回忆一下。
08:00
大家还记得,呃,当前我们这个。哦,我我这个集群都已经停掉了啊,那就干脆直接stand啊,大家都已经测过了,这个就这个就没问题了,对不对。Start cluster。我们直接就用这个三模式把这个集群提起来就可以了。好啊,现在已经有了,看一眼这个。Local host,呃,这不是local host啊。102。081现在有两个task manager,每个一共一个slot,所以一共有两个对吧?啊,那这个我们也当然知道这个。直接提交对应的这个作业。然后这里可以给一个entry class。Copy一下。诶,这里我们给一个啊,如果不给的话,我们知道并行度是一对不对啊,所以我们可以直接说一下plan看一下啊,我我不直接提交收plan看到的这个图是一样的啊啊,所以大家就知道当前的这个图是根据什么画出来的呢?就是根据程序画出来的嘛,啊所以既然能解析出这个图,大家就看到这里边我们这个集群已经做了一些事儿了,对吧,已经把我们那个,呃,这里的这个main方法已经运行过了,已经解析出对应的这个作业了,那这里大家可以看到里边。
09:28
Source socket stream,这对应的是什么?不就是我们?这里的so text,呃,Text stream吗?这个方法调用,这就对应着这里的步步操作对吧?一个算子,然后接下来Fla map,那当然这里这个flat map是第二步操作,又又是第二个算子,然后再接下来是k by some,注意k by some它这里是一个东西,它叫做kid aggregation。分组之后大家知道aggregate是聚合的意思吗?分组之后的聚合?
10:02
所以A并不是一个单独的分子,它俩合起来,这个叫一个分组聚合算子。是这样去分类的。啊,那最后还有一个,那就是pink对吧?Print to,呃,到这个标准控制台,所以pink对应的就是这里的这个think,这样大家一看就一目了然了,所以程序跟最后这个数据流图上面每一个算子啊,对应的这个关系是这样的一个一个一一对应的关系。那如果简单理解的话,可以认为。从这里边我们的每一步转换,数据的转换都对应着一个分。这就是所谓的程序数据流。
我来说两句