00:00
好了,那么接下来咱们的主要工作就是来找到什么这个类了吧,哎,然后到咱们咱们的源码里面去瞅一瞅啊。好,那拷贝,诶,这是我已经打开的一个源码,对吧,Link是基于1.12.0的版本。那这边怎么找类啊,你可以双击shift,也可以CTRL加N。CTRL加N是什么?查找一个类的啊,只只查找类功能相对单一一点啊,看你习惯了哎,我粘贴它就跳出来了,跟这个名字相关的,对,那么咱们要找的是不是就是第一个呀,对吧?点进来啊,我把其他的先关掉啊。这个就是咱们要找的地,你看它这边有一个注释啊。它是一个什么实现呢?简单的命令行前端,这个是前端的意思,说白了就是面向用户的可操作的命令行。
01:07
或者再直白一点,是咱们的入口吧,啊,就这么简单的一句话,入口啊,那咱们找什么?找什么呀?咱们Java程序执行一个类。应该执行它的什么方法,是不是may方法,诶对啊,这些大家应该都知道对吧,那怎么找呢?CTRL加F12可以看到它这个类的一些构造一些方法属性啊,这样找比较快。按出来之后,咱们直接输入may也可以实现实现一个筛选过滤,那你看是不是找到了好双击。是不是这个类里面有一个main方法对吧?啊。核心逻辑就在这儿了啊,那我们接下来就要来看一看了,同学们。啊,咱们由粗到细好吧,啊,那像这种,呃,关于日志相关的我就不再啰嗦了啊,咱们看核心逻辑,那首先看第一步这干嘛。
02:08
我们先猜名字吧,哎,看能不能见名思义对吧,写的好不好,是不是获取一个配置的目录啊,说白了就咱们link是不是有个目录对吧?哎,他就是来获取这个目录的。那我们也可以稍微简单瞅一瞅,点进来,呃,那么大家可以看一看他做了各种什么了。他是不是先获取从环境里面获取了一个。这个东西。路径啊,哎,我们点一下看一眼。Sli conung DR,它通过这个名字去哪找啊,是环境里面,那环境是不是刚才我们讲的在conflict.sh这个里面已经配置好了啊,所以这一块啊,这不是咱们关心的啊,咱们就是给大家啰嗦两句啊,那后面的这些呢,大家想看看啊,不想看也没什么重要的对吧?哎,也就是路径的获取啊,那么这边我可以给大家写一些注释对吧。
03:14
获取link的。Com目录是吧。的路径啊。啊,我加个todo这样显眼一点啊,相当于给大家做一个笔记对吧。那么后面这个呢,获取到路径之后啊,它又调用了一个方法。咱们拿路径为了什么?是不是为了读配置啊?哎,没错,这里就是加载配置啊,根据这个路径加载里面的配置项啊。啊,根据路径。康复路径加载配置。是吧,那这边呢,我们同样也来看一眼啊。
04:03
大家注意,咱们看源码的时候,可能大家会有时候有些细节方法会跳进去看,对吧,那么对于大家来讲,可能会造成思维上的混乱,那么大家应该怎么去呃吸收呢?首先有一条主干道,是不是像刚才第一步第二步第三步啊。哎,那我每一步可能会展开进去看一下对吧。哎,那么如果这些细节你觉得比较晕,无所谓,但是主要逻辑123你思路记得就可以了,像第一步是不是读路径,第二步是不是读配置啊,你记住这个也够了,那么再细节的你能捋清楚那最好,对吧?啊,当然我都会讲啊。好,加载配置咱们也来看一看。呃,又封装了一层对吧,啊,再点。那么这里面呢?是吧,Flink ya是不是那个核心配置文件啊。
05:02
对吧,咱们经常去改的那个文件,把它读进来,诶之后呢,后面就加载的吧,哎,这一块加载配置没什么好讲的,大家大概瞅一眼就行了啊知道在哪里怎么去找啊好返回返回返回大家会用吗?上一步啊,CTRL加alt,再加上左方向键对吧,就跳回上一步嘛,啊,现在又回到咱们的主要逻辑上面,没方法啊。没方法好,接下来第三一步。加载什么自定义的命令行嘛,说白了是什么,是不是咱们在命令行输入了一个flink run。这些啊,那后边是不是有一些参数啊,对吧,那弗link这边呢,是对咱们输入的病例做了一个封装,封装之后它叫什么呢。叫command line命令行啊,就这么一个对象啊,这么一种类型,那么大家知道。
06:07
呃,那这边呢,我们瞅一眼,这边我们要知道哪几件事呢?哎,要知道他这边加载了几种客户端,那首先第一个核心逻辑在哪里。是不是new了一个A对吧,好之后呢,ADD这是第一个大家要关注的点。再往后。这是第二一个。是不是也是二的添加,还有后面还有一个二三好,那我们来看看分别是什么啊呃,那首先添加的第一个叫generic是不是。可爱客户端第二一个叫什么。Session客户端对吧,那第三一个叫。
07:01
啊,不是这里啊,这不是第三个,第三个在下面啊,我们往下拉一点。这个是第三个对吧,默认的客户端,那这个我们要注意什么呢?它是有顺序的,同学们这个顺序不能乱。首先是一个jaric,之后呢,是不是雅安呢,在之后是一个默认的,那为什么要讲究顺序啊,大家想一想,我们不管是stand alone,还是雅安session,还是per job,是不是通通都是flink run了?那怎么区分是独立集群还是雅安的朋是session呢?我们是不是。如果不指定杠T是不是可以啊?对吧,不指定杠T是不是也可以是真的提交,也可以是雅恩提交。那它怎么区分呢?就是依靠这个区分,你不是按顺序添加了三个吗?哎,他判断的时候,它是挨个取出来,挨个取出来,如果第一个诶是活跃的,那么他就用第一种,如果第一种不活跃,那么接下来。
08:10
是不是第到第二个,第二个是不是雅安了,对吧?啊,如果不是第一个,那接下来直接就到雅安了。那么如果雅恩都没有才会执行默认的也就是登弄就这种啊,所以这里顺序是有讲究的啊,当然我文档都给大家讲了啊,在这边啊,创建哪种你看。文档这边是有加红给大家标识啊,依次添加,那么到后面呢,它是按顺序取出来。那这边简单记一下啊。Command line,我们说一次。依次添加什么JA对吧,还有雅安的还有一个default啊,这里是。
09:09
呃,这么众多过程里面,咱们要必须要知道的一个小细节,好。那这一块咱们就可以回退了,对吧。好,回推。回到咱们的核心逻辑啊,这边给大家再加一下,我们说呢,呃,封装命令。行接口是吧,那么这边按顺序是一个gene雅before。这样大家可能就呃方便去看了啊,到时候就直接拿拿这一份源码去看就行了啊。好,再往下看。是不是利用了一个。这个对象啊,就当前这个类嘛,对不对啊,当前这个类,好,那获取到它了,并且把咱们之前那个命令行接口是不是传进来了,好这些不重要,再往下看。
10:11
接下来哪一行才是重要的呀?是不是乱了?对吧,前面是安装,就是一些环境的设置啊,那这一块也咱们啊,也不用去关注是不是核心逻辑在这啊。这个是一个什么写法,拉姆达对吧?哎,那这种run是不是执行的意思啊,哎,对吧,就像好像执行一个线程是不是也是run啊对吧?哎,那这边呢,它就是执行这个,哎,所以这个是咱们核心逻辑给大家打一个点啊。这样简单标一下啊。接下来我们就要往这看啊,往这看。那大家注意,这里是不是传了一个二。二是哪来的?是不是这里啊,Main方法的参数对不对好。
11:04
接下来我们就进去了。同学们点。点进来之后,进入到一个解析和执行的方法,那首先对参数做的一个判断是判断它的长度啊,诶大家注意这个参数对于咱们的命令来讲是哪一个啊。是哪一个?是不是从run后面开始都算了。对吧。这是脚本,这个是动作,后边是不是都是二本。对吧,啊,这个就是咱们的二。好,那二零。啊,那个动作也放在内啊,啊,就除了flink这个脚本之外,其他的都是参数啊,啊刚才说差了啊,应该是什么呢?从这切开对吧,包括转也是参数。那么零是不是第一个参数啊,那是不是就是咱们的动作,动作是不是就是所谓的run。
12:07
好,那你看下面是不是做了一个分支判断。Switch case嘛,这个语法是不是类似于if?是吧,哎,这个相信大家没问题,呃,那你看这个是什么呢?点是不是一个run。Run动作叫run,你看还有什么动作,是不是list,它叫list,还有pencil是不是取消啊啊等等,还有stop啊等等。还有啊。说白了,那咱们是不是看这啊,因为我们是执行的一个run动作。它里面又调用了一个run方法,是不是好再往里走啊,我给大家打个点好吧,再往里走。是不是会打印一个日志,执行一个run命令啊,啊,这个大家启动的时候可以看到啊,那么接下来呢。
13:05
你看这么一坨,那我们挨个看呗,第一个叫前端的什么。是不是解析器啊,解析什么呢,大家觉得。是不是解析参数啊,咱们输入的那些什么杠T啊,杠C啊,这些是不是都是参数啊,啊,他要做一个解析识别,那首先第一步。获取运行命令的。选项配置项对吧,啊点看一眼啊看一眼。呃,那这边呢,它调用了一个be的JA。是不是一个通用的配置啊。啊,说白了这边是干什么,默认配置。默认配置项,它先加载一个默认配置项,这个不是咱们输入的啊,呃,给大家瞅一眼,呃,你像这里边。它是不是加了一个help。
14:01
就是杠H嘛。我给大家执行一遍吧,大家更直观一点,Flink是不是杠H。它是不是就打印了这么多命令信息啊,呃,说白了就是这里这个help of好吧,好,那其他的啊,没什么往回。关键在这儿。获取程序什么呢?特有的一些配置嘛,说白了就是自带的默认的配置啊,瞅一眼你看有什么,我们看名字就好,不深入去看了好吧,哎,不然太太过抠那个字眼了,对不对,你看是不是架包的配置啊。类的配置啊,还有什么class pass是不是类路径啊。还有参数等等等等等等,还有并行度是不是杠P啊,这些是咱们可选的配置项。什么叫可选呢?它能识别的配置下。
15:01
能够识别的配置下。好,我们返回吧,这一段也不啰嗦了,我给大家标一下啊。这是什么?我们获取run动作。呃,默认的配置项,这个不是咱们指定的,对吧,它只是说有哪一些配置咱们可以去指定好再看下一个。是不是获取命令行的客户端呢?那这一块呢,咱们看是不是把二传进来了。这个咱们说了是不是后面的参数啊。好,那这一块呢,就是咱们。命令行指定的了,是由咱们写的,有哪一些配置啊点。呃,那。他是这边做了一个合并也好,解析也好,这一块我不想去啰嗦了啊。
16:00
不想去啰嗦。那还是讲一下吧,好吧,解析怎么解析的?来,我们重新进来。点进这个方法,Get command line。在里面呢。这个是什么?参数。来,我给大家看是不是这里啊。所以默认配置项,那第二个参数是啥?是不是咱们自己的配置啊。好,他其实就是对这两个做一个匹配啊,对吧,做一个匹配,呃,那之后做解析,咱们直接到了下一个核心逻辑是不是解析啊。解析参数啊对吧,前面啰嗦那么多,接下来总该解析了吧。好解析点。点进来之后,大家会发现跳转到这个类。Client pass是不是解析器啊啊,解析方法又掉了一层对吧,没事往里追再点我给大家点一下吧,啊点。
17:06
点进来之后又一层对吧,啊,又跳转到另一层,大家注意flink它源码有时候一个简单的一个小功能,它要跳好几层。无所谓,咱们直接往里点就可以了啊。三点。好,终于来到核心逻辑了,对吧,啊,终于来了。那我们还记得这几个参数吗?这个是不是刚才添加的默认自带配置项啊啊,这个是不咱们的参数啊啊,这个大家知道就行了,来往下走。往下走是不是另了一个command对象啊,这个呃不重要,来关键是不是这这里是关键,同学们,如果咱们的参数不为空,也就是说咱们指定的什么杠P-C这种对吧?好,接下来是不是对这些进行便利啊。对不对,咱们是不是以空格分隔的呀。
18:03
是吧?咱们输命令的时候,不就是空格分格的吗?这个不就是空格吗?这个不就是空格吗?这个不就是空格吗?对吧。好便利,然后呢,对每一项调用的一个方法,这对吧,好。标一下进来。那这边做了什么事呢?你看一个分支if s啊。要不要跳过,如果跳过那就什么都不做对吧?啊这个不不咱们不关心,这咱们关心哪看这跟这。Start为是不是以什么开头啊,哎,如果是杠杠开头,是不是就进入这个方法呢?那么如果是横一个小杠开头,是不是走这个,说白了,咱们比如说举个例子啊,咱们杠C这个参数是不是可以杠杠class可以这么来写对吧?那同样的是不是也可以按短的写法杠C啊对吧?哎,它就是来解析这个啊,解析这个呃,那具体的逻辑。
19:13
呃,简单投影文档是写了,他还判断的是哪一种形式的,你看这么多种形式对吧,又进一步做了一个判断是哪一种,是不是解析啊啊这个咱们这种非核心逻辑也不用去看了啊,那里面看他怎么解析对吧,无非就是。特定字符串获取索引,然后做个切分啊,就这样而已,好吧,这个咱们不用去关心,还返回。返回到这个分支里边,那么大家想想,除了这种杠T,咱们还有什么?是不是具体的负值啊,那比如说这个是不是具体的负值啊。杠记是参数名吧,这个是参数值吧。常书值可没有杠开头吧?对吧,所以它就会进入到这个方法。
20:03
首先当前选项不为空啊,就比如说雅安喝旧的这个配置配置下啊。哎,然后呢。呃,判断它是一个参数,而不是杠开头的,说白了就是它不是杠开头的,或者说咱们更简单杠P2这样子是不是指定并行度啊,如果这个二它就走这里。能理解吧,参数值啊,然后呢,也是做做一个解析好,那么这一块呢,呃。不用再去看了,好吧,啊解析。那终于咱们费老半天劲对吧,那么至于大家要记住的是什么。是不是在这里面我返回再返回。好,返回到哪里呢?咱们这个run这里啊,还记得吧,这是咱们的主。主逻辑对吧,哎,不要不要搞丢了这一块啊。
21:00
好,这里我们说会做一个什么呢。我们说默认配置,呃,根据用户指定的配置对吧,配置下什么进行解析吧,这不就得了吗。解析什么,比如说杠T-T-C这种是吧?啊。这个就是咱们一个。解析啊。
我来说两句