00:00
那现在我们既然已经把这个代码都做了一些调整啊,也完整的写完了一个基本的应用,那就要启动flink生产集群,然后去做一个部署和提交了。好,那接下来首先我们要讲一下flink部署的方式,在flink集群里边啊,是可以有各种各样不同的部署方式的,最简单的方式其实就是。三洛模式,三洛模式呃,大家可能知道啊,这是所说的就是就是这个,呃,独立的这样的一个模式对吧?呃,就是独立的一个flink集群,它并不依赖于其他的一些资源管理平台,跟其他的平台没有交互,就是自己只要有对应的这个节点啊,提起来就提起来了啊,那所以接下来我们先以这个模式为例,给大家看一看整个的部署安装的过程,呃,首先我们需要去下载这个flink的安装包啊,当前我们用到的版本是一点十点一,大家看到这个版本是叫flink一点十点一杠B,然后杠LA2.12啊大家看到这里边后面它直接就有一个SKY放在这里。
01:08
啊,为什么呢?还是之前跟大家说的,因为flink里边不管你提供不提供这个SKY的API对吧?呃,至少这里边是不是它用到的一些组件,像阿卡底层是有这个skyla的源码啊,啊,所以这里边你必须要对应的有这个skyla支持的版本啊,我们当前的skyla版本是2.12啊,把这个可以下载下来。当然大家也可以到这个官网上去下载这个不同的版本啊,比方说大家看到这个downloads,这里边现在最新的版本已经是01:11点二了啊呃,然后这里边如果有同学想要下载这个更早之前之前的这个版本,那怎么办呢?啊,这个其实也非常简单,你看这里边all stable releases,对所有这个稳定的之前的这个发布的版本啊,那大家看到这个01:11的,一点十的啊,1.9 1.8 1.7啊,往前你都可以直接下载的到这里边,如果说你想要去直接点开的话,点这个bainaries,大家看S的话,你知道这是源码对吧。
02:10
想下源码你也可以来这下啊,Dogs这文档啊,有Java的和scla的分别都可以去下载,如果要下这个安装包的话,下baries。呃,我们随便点一个版本,比方说1.7.1啊,大家看到这里边其实就对应着,诶各种这个不同的下载安装包,对吧?诶这里边这个版本很多大家看到。这里面除了这个基本的b scla2.12和banla2.11这些这个呃安装包之外,大家看中间还有一些版本是加了哈杜OP27,哈杜OP28对吧?这是什么呢?诶这指的是就是添加了哈杜op依赖支持的这个安装包。那所以就是说,假如说后面我们讲到你如果不是STEM模式,我需要在这个雅恩模式下面去,呃启启动这个集群的话,那大家知道雅恩模式下的话,是不是一定要有海杜普相关的依赖支持啊,对吧,你的这个集群肯定是需要有的啊,那弗link这里边跟哈杜甫那边去做交互,也是需要有一些依赖支持的,所以这里边呢啊对哈杜甫这版本也有要求,对吧?大家看这里边就是二四开始啊,24262728,主要就这几个版本啊,如果大家那边的版本高的话,一般也是支持的,这个都是没什么问题吧。
03:29
我这里边要说一句的是flink1.7之前大家看到这个这个哈,支持的版本就直接直接放在里边了,对吧,压缩包就压在一起了,你对应的下对应的版本就可以了,那现在你看这个一点十或者01:11里边啊。大家看现在是不是这个可供选择的就很少了呀,这里边可供选择的就只有,哎,你看就是being scale2.11BSC2.12对吧,那就只有这样的两个包了,那那这样的对应的那个海杜甫支持的那些版本怎么下呢?
04:05
它是相当于不再直接捆绑打包在一起,而是分离开,你按照自己的需求想下什么下什么对吧?所以现在你假如说想要有对应的那个哈多be依赖的话,那下什么呢?大家看到这儿来额外的这个组件对吧?这里边它提供的这个额外组件,这个是呃,这个哈都不2.4.1 2.6.5 2.7.5 2.8.3对吧?啊这么几个版本,那基本上大家现在就是比较新的哈都版本其实都是支持的啊呃,你直接用一个这个2.7.5或者2.8.3的这个版本都是没有问题的,这个下载下来之后呢,就是我们在文档资料里面给大家提供的那个,呃,就是就是shad的那个那个,呃,打包好的那个插件对吧,那个东西是要放在我们对应的卡杜普安装的那个库的目录下面啊,所以接下来我们要给大家看一看啊,这个flink如果要是去做这个安装部署的话。
05:04
到底应该是什么样的一个东西,好,我先到当前已经下载flink之后的这个这个目录下边,大家看这是我当前这个10.1.1的,呃,这个版本对吧,Flink版本首先第一步是不是应该要对它先做一个解压啊,啊这个非常简单啊,把它解压,解压之后呢。大家看就是上面这个,我这个已经解压好了,Flink一点十点一,那我们接下来进入到对应的目录下边去,所以接下来我所有做的操作都是基于当前这个flink一点十点一,这个跟目录做的操作,对吧,我我不会再切换目录了啊,大家注意一下就能看清楚我做的这个各种操作就可以,首先我们先来看一下当前有哪些目录,下边有哪些文件夹,首先我们映入眼帘的啊,大家看到。B。啊,然后是cof康康大家知道康是对config配置文件,那病的话,大家知道里边就是一些啊对常用的比方说脚本啊,一些命令啊,对吧,二进制文件啊,Binary啊都在这个下边,然后examples,这是示例了,例子了,那还有一个lib lib这是library库对吧?哎,这就是我们现在想要用到的一些额外的支持的一些一些库,所以这里我要给大家看一下。
06:30
我们直接看一下这个当前的library这个目录。这下面有哪些东西呢?啊,大家看到有这个flink Dis对吧,然后有注意看有flink table对应的这个抓包,还有flink table blink,哎,对应的这个炸包啊,这就是我们对于这个flink table API啊和这个高层级的CQ的这个支持,这里面它的经典版本和当前这个阿里的那个blink版本都已经放在里面了,对应的这个支持都已经放在里面了,另外还有这个love for JL for j啊日志相关的这个,呃,这个包啊,都都打包在在这里,放在这儿了,库里边。
07:13
这里需要注意的111个是大家看这里有一个这个flink shadd had豆OP2 Uber2.75,呃,10.0兆对吧,这个包,这就是我们在官网上,你假如想要添加哈杜be相关的支持的话,下载下来的那个jar包。所以大家注意啊,你直接解压flink安装包的时候,这个library这个库目录下边应该是没有这个抓包的,这是我自己添加进来的对吧?啊,所以大家稍微注意一下啊,你对应的那个版本下载下来之后,要放到这个lib这个目录下边,然后才能有哈杜普相关的依赖。支持对吧,接下来就可以比方说在雅安上去做部署了。这是首先给大家介绍一下基本的目录结构啊,然后给大家说一下,接下来我们看一下当前的这个并目录,并目录我们说了啊,里边主要就是一些啊脚本文件,启动命令啊,能做的一些相关的操作都在这里边有所体现,那这个并目录下边大家看放眼望去都是基本上都都是这个SH结尾的文件,对吧?啊,都是一些shell脚本,那这里面最重要的是哪些呢?
08:28
这里我给大家画一下,首先我们要想启动flink集群,那是不是就应该有这个呀,大家看start cluster对吧?点SH这个是比较常用的一个一个脚本命令啊,我们启动集群的时候要用它。当然有起就有停,有start就有stop,对,所以这两个是启动集群的时候需要用到的。然后呃,另外大家可能会看到这里边有什么呢?有什么job manager对吧?啊,然后有这个什么,呃,这个对应这个sta job啊,有这个start zoo keeper啊,还有这个task manager啊,这些又又都是些什么呢?这就是我们整个集群里边的一些组件啊,后面讲到运行环境的时候,会给大家详细介绍他们分别是用来干什么的,这里边可以先提前给大家说一句,就是这个draw manager是啥呢?字面上理解的话,这个叫。
09:23
叫作业管理者对吧?啊job manager嘛,作业管理者他其实比较类似于之前我们在Spark集群里边的这个。Driver的这样的一个角色。啊,所以它其实是有一个啊,就是相当于对于作业进行驱动,进行调度,进行分分发分配,对吧?呃,是整个这个作业的一个管理者啊,所以它的作用其实是一个核心位置啊,核心作用,那至于这里面的这个task manager又是什么什么东西呢?字面理解的话,这个是任务管理者,也就是说他管理的就只是当前的这个任务,就是说你干什么活,这个活就归你管了啊,那那那大家其实就知道了,这听起来这个名字叫是叫manager,听起来像个经理一样,事实上他不就是干活的人嘛,啊对吧,就好像我们公司里边啊,每个人都安一个头衔,都是什么什么经理啊,结果我们自己安一个头衔是这个干活经理是吧?啊,那其实我们就是干活的人而已,是不是我们管理的就不管不管人,只管只管活啊,那所以这个task manager对应到我们这个Spark集群里面的概念,大家可以认为就像是。
10:36
对,Ex一样。啊,这个就是简单写一下啊,大家可以大概的有这样的一个对应这样的一个感觉啊,那后边我们还会详细的说在flink的运行时环境里边,他们起到的作用分别是什么啊,那另外除了这些之外呢,还有一个大大家看这里边有一个叫。雅n session sh对吧,那雅n session这就是跟雅恩部署提交相关的,对不对啊,这个后面我们会讲到啊,如果在雅恩模式下边去做提交的时候,有可能会用到这样一个命令。
11:14
另外其实这些东西都不是特别的重要啊,啊大家看,另外还有一些,你比方说这个什么py flink,大家知道py flink是啥呀?对Python相关的那些支持对吧?那些命令啊,然后另外还有呃,Cus entry CU session这是啥呀?对K8S上部署的一些啊这些命令对吧?呃,跟这个雅安session是类似的一些功能,那还有这个me,呃,APP master me task manager,大家知道这是跟那个me去做交互的时候,对吧,有了一些这个命令,那这里边重点要给大家说的是,大家看到前面这里边第一第一列的这个命令了吧。这可以说是整个我们这个目录下边最特别的一个命令,因为它没有后缀,它直接就叫flink对吧?啊,所以其实这是我们当前最重要的一个命令,也就是说如果我们启动集群之后啊,前提是先启动集群,启动集群之后,假如说我们想要去在集群上提交一个作业,对吧,想要去或者说看一下当前作业的运行状态,或者说取消停止当前正在运行的一个作业,所有要做的这些命令行的操作,都可以直接用这个flink命令来实现。
12:30
啊,所以这个其实是最重要的一个命令对吧?具体的话后面我们再说啊呃,这是先把这个大概的看了看,然后接下来呢,这个B目录看完了,我们发现这个最重要的其实就是这个lib b还有config对吧?哎,那至于你说后边的这个像license啊,Log啊,这些plug in这些其实就都无所谓了啊,我们重点最关心的其实就这三个啊,Lib b还有K,所以接下来我们再看一下这个comf,大家知道它其实是一个其实是一个配置目录对吧,配置文件的一个目录,那这里边我们一眼看过去好像大部分都是这个log back呀,Log for j对吧,都是跟这个日志管理相关的啊,那这里边最特别的是一个什么呢?
13:18
大家看最前面的这个,对,有一个yam文件,这个yama文件叫flink com yam,所以这就是当前我们flink集群做配置的核心文件,我们看一眼里边到底长什么样子。Flink com,呃,我现在是在外边对吧,所以我要加上这个目录啊flink com。这就是里边,里边我们看一眼啊,这里面大部分都是注调的啊,这个注释非常的详细啊,大家感兴趣可以仔细去看啊,我们就直接看这个大类吧,首先第一大类大家看这里是common。这个通用的一些配置项,我们一般上来之后配置主要也就配配这个common里边的东西就可以了,看一眼里边有啥东西,下面这几项,哎,大家看一下这里边的这个配置项啊,首先是一个job manager.rpc.address。
14:16
然后冒号local host。这种写法其实就是yam文件里边配置项的这个要求啊,它是什么呢?就类似于我们配置项都相当于是k value嘛,对吧,一个K一个value,那它其实就是前边是这个K,然后后边是冒号空格,然后后边是它的值。所以当前我配的这一项其实就是。Job manager的RPC通信地址。啊,大家知道job manager,前面我们说了,他就是那个类似于driver的角色,对吧,整个这个作业的管理者吧,那大家想这个RPC又是什么呢?对,大家知道这个,呃,RPC是远程过程控制对吧?啊,所以我们在一般在做这个集群网络通信的时候,都是用这个就是呃,远远远程过程调用啊,这样的一个RPC通信协议来做这个信息交互的,所以这里边你需要有一个配置job manager,它的通信地址以及它的通信。
15:17
端口manager rpc port对吧,默认的端口是6123。啊,这两个基本上就是一般情况啊,我我我们这里边就是按照自己的这个实际情况配就可以了,这个端口一般也不会改,对吧,默认就是6123,然后接下来我们看一下下一个这个就有可能要改了,Draw manager.hip.size。1024M1024M,当然这就是对一个G啊,1024JOB,那所以这个job manager he size说的就是job manager啊,它的JVM对应内存大小对吧?所以我们在实际运行的过程当中,大家可以认为啊,所谓的job manager,它是运行在我们配置好的一个节点上的一个。
16:04
JJVM进程对吧,就可以认为就是它就是一个运行着的JVM进程,所以我们要给它配置这个当前的堆堆内存大小,然后另外下面还有task manager memory process size,这一看这又是一个size,又是一个大小,是吧?啊,所以大家看到它的定义是什么呢?它定义的是。Total process memory size for task manager,这指的是什么意思呢?就是当前这个task manager整个进程的总内存大小,那跟前面我们指的那个GVM对内存大小又有什么区别呢?诶,当然不一样,因为大家想到是不是我们对于一个这个flink task manager来讲,看它的这个定义,这就说明是不是有对内存也有对外内存啊。对吧?啊,它可以配置这个对外内存在flink集群里边啊,之前我们不是说过flink执行过程的时候是有状态的流失计算吗?哎,那当时我们就说过一个状态,这个是要放在本地内存里的是吧?那到底放在哪里呢?
17:13
啊,这个大家要注意啊,就是后边我们讲到,如果说我要定义一些,就是用让flink帮我们管理起来的这些状态的话,它是直接定义在对外内存的。就是我们所说的这个managed memory啊,管理起来的这个内存是放在整个对外的这个空间的,所以你这里面配置得配置不一样,对吧,那那堆内存又放什么呢?哎,那大家知道堆内存我们嗯直接所有的那个,呃,就是我们创建在在代码里边应用的时候,创建出来对象是不是都会放到那个对内存里面去啊啊对吧?啊,所以它会受到我们整个程序这个GC的影响啊,那所以这里边的这个总内存。大家就知道它的大小是不是要比堆内存本身要大呀?
18:01
它就应该包含对内存和对外内存对吧?啊,所以这个是有这样的一个限制啊,啊,那这个给大家多说了这么多,主要就是因为。早些时候啊,早些版本这个做这个配置项的时候,其实它叫的没这么复杂,它直接叫的就是task manager.hi.size就就跟上面这个一样,但是这个就容易引起误解,大家想你如果叫hip.size的话,是不是我理解就是对于内存啊。但是事实上我们后面是不是在这个状态处理的过程当中,又要用到对外内存啊,所以那你说这个东西到底怎么配呢,你是配了还是没配呢?所以后来就把这个就干脆啊,直接叫做memory process。啊,这个大家可以呃,下来之后大家可以就是自己配一配看一看啊,我这边给大家提一个问题,这两个在实际生产环境里边,是drop manager的对内存要大呢,还是task manager的那个内存要大呢?
19:00
他们应该谁配的大一点啊对,肯定是task manager配的要大一点,对不对,因为对他是干活的人,那draw manager这边是不是他只要做这个任务调度,所以他可能占用的这个内存空间有限啊,啊,所以我们真实干活的人,他是有可能要存大量的状态,然后可能有大量的这个啊,我们这个本地变量有大量的对象产生出来,对吧,这是很容易造成我们这个内存不够用的,所以真实的运行场景里边,Task manager这个内存配置啊,可能要比这个job manager可能要大很多。啊,这个是完全有可能的,这里边这个默认啊,集群默认项,这个好像是也没大太多啊,1728兆,好,然后我们再往下面看,下边还有两个重要的配置项,一个叫做来看这个叫task manager.number of task slots,这是什么意思?诶,这里边大家看到这里边提出了一个概念叫做task slots slot大家知道它的含义是呃,插槽槽位对吧,就类似于这样一个概念啊,其实这个概念在有一些呃框架架架构里边是有这样概念的,对吧?啊,比方说其实在多op里边有时候也会提到类似的概念啊啊,但大家可能一般呃就是接触的可能比较少,这个在flink里边,这个概念非常重要的。
20:25
那所谓的task slots其实是什么呢?他其实就是我们接下来那个task manager不是干活的人吗?我们不是说你当前这个要做这个并行处理吗?要做多线程处理吗?那你怎么样一个task manager怎么多线程呢。哎,那大家想是不是我要把这个资源做一个划分啊,划分成不同的,哎,这里就是槽位对吧,不同的插槽slot,然后在这个单独的task slot上就可以去相当于运行一个独立的线程,那接下来是不是相当于我有几个slot就可以跑几个线程啊,啊就类似于这样的一个概念,所以大家看这里边我定义这个task manager.number of task slots,这是什么意思呢?
21:15
这个是什么意思啊,对,这里边给它是一的话,就表示我这里边配一个task manager,一个节点上面是不是就相当于只有一个槽位,那你要你要是多线程执行的话,是不是相当于它就只能执行一个线程啊啊对吧?哎,那就是相当于你就得多配几个task manager,这样的话,那他们这才是一个并并行执行的一个状态,对吧?你如果单独一台机器一个task manager的话,它就相当于只有一个线程啊,串行。然后接下来后面还有一个概念。这个概念叫做parallelism.default parallelism之前我们见过一次,这个我们在代码里面可以设并行度,对不对?Set这个,那大家看这里边是有一个默认并行度,这里面给了一,那这个默默认并行度又是啥呢?
22:08
啊,并行度大家比较好理解,这不就是我们,呃,这个代码执行的时候,它这个有几个线程执行嘛,对吧?那所以这里边默认并行度,那就是默认是用一个线程来执行,好提一个问题啊,那它跟上面这个有什么区别呢?这个这个parallelism.default和这个number of tasklos有什么有什么关联,有什么区别呢?它俩是一回事吗?对哦,大家会想到这里边其实这个number of task slots,这是不是相当于是当前task最大能够同时执行的线程数量啊,而我们下边的这个parallel怎点default,这指的是对真正执行的时候的那个并行的个数,对吧?所以你如果要对比的话,上边这个这是并行的一个最大的能力,这是一个静态的能力状态,对吧?
23:03
而下边的这个呢,这是动态的,你有多大能力,现在是你用多少对不对,你不一定要要要竭尽竭尽全力,你可以比方说我我这个tasklo我可以有五个,我这里面只用三个行不行,那这是完全可以的呀,啊对吧?啊,那那有同学可能就想想到了,那要这么说的话,是不是上面这是一个最大的这个并行程度,那下面是实际运行,是不是下面这个一定要比上面这个小呢?哎,大家这个要注意一下啊,这个未必,为什么呢?因为啊,首先是这它只是个默认值对吧,默认值就是在别的地方没有配置的情况下,我才用这个。那大家想之前我们在那个代码里边直接就Env.set,就配置了,那你说我还会用这个默认值吗?那就不用了,对吧,你代码里边自己已经配了吗?另外还有一个就是说大家注意啊,这个number of task slots,它是针对几个task manager来说的呢,对,大家注意啊,这是一个task manager,那我当前的这个集群里边只能有一个task manager吗?诶,那就没准了,对吧?那我如果要是配置了多个task manager,那其实理论上能够提供的slot。
24:17
是不是应该是就这里边的这个numberlo个数,然后再乘以task manager的个数啊,啊对吧,其实它俩乘起来,这是它的最大能力,所以你这里面的这个并行,只要不超过那个是不是就没问题啊啊,所以这个大家稍微的了解一下这个配置的这个过程啊。呃,然后这里面既然提到了task manager的这个,呃,配置的个数,那大家就会想到,那这这个里边我们并没有涉及到配几个task manager啊,那这玩意儿怎么弄呢?啊,这其实是在大家看配置文件里边还有几个。这个叫masters。这指的是。啊,我这个就直接cat就可以了,对吧,直接给大家看一下当前它的内容,我这里边默认写的就是local host8081,所以这个master其实就是当前。
25:14
当前我的master嘛,那是不是就是管理者啊,呃,上位者对吧,呃,Job manager,然后这个8081是他的我们提交job的那个入口端口连接的那个端口号。啊,所以这其实就是job manager的那个给我们提供的接入点,然后还有一个叫。对,跟它对应的还有一个叫slaves slaves大家知道这个是主,这个是仆,仆从对吧?啊,这个其实就是奴隶嘛,奴仆啊,那所以slaves其实就是。对应的是不是就应该是我们的对task manager啊啊,所以这里边大家看我这里面默认就只有一个叫local host,那所以我现在如果直接启动是不是就只有本地一个节点一一台机器,然后呢,起了一个进程是当前的job manager,然后又起了一个进程是当前的task manager,对吧?那就只有一个task manager这样的一个集群,那大家如果要是在下边直接自己去配集群的话,应该怎么配,大家能想到吗?
26:19
这个应该怎么配啊,对对,大家看这里边文档里边给大家提供的这个例子啊,就是我这里边呢,就应该啊,比方说我这里边默认的那个RPC主题名不是叫local host吗?那大家这里边的话就是你的照manager是谁,你就配成谁对吧,比方说我叫哈杜不一,然后接下来呢。我比方说我有另外两台机器,作为当前的task manager。那我是不是就配那个slaves那个文件啊,我直接把它调成哈二哈三,那大家可能想到那为什么不配那个,呃,Master里边的那个local host呢?呃,但是那个你如果想改的话也没问题对吧?呃,这里边主要就是涉及到一个,我后边如果不改这里的local host的话,那我就需要在。
27:06
当前的这个drop manager这个节点去执行启动当前的这个集群,对吧,你如果在当前节点启动的话,那你是local host也没问题,所以大家就照这个这个过程啊,啊,我就把另外的两个机器的那个主机名添加到s slaves里边,然后另外现在是STEM模式吧,啊,那我们没有那个统一管理资源的这个平台,也没有统一这个配置flink的地方,那是不是要得把这个flink对应的这些东西,包括配置项的,配置文件的这些,呃,这个这个包对吧,整个这个安装的这个程序啊,是不是全要分发给另外两台机器啊。对吧,我们把这个直接分发给别的机器啊,然后接下来启动就完事了。啊,所以整个这个配置其实是非常简单的。
我来说两句