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