00:00
好,各位同学,那接下来呢,我们去呃,开始搭建这个麒麟,那麒麟的搭建呢,其实就比较简单了,我们因为我们已经做了很充足的准备工作了,对吧?啊好,那接下来开始搭型气垫新在搭建呢,主要就是讲铺啊下下载安装包,然后之后呢解压,那现在我们已经拿到安装包了,咱们开始解压啊。先找到咱们的安卓包,应该在OPT software k麟里边对吧,那这里边是不是有一个阿帕奇麒麟啊,对吧,我们尔杠ZXVF阿玛奇麒麟,然后到哪是不是到杠大Co OPT这个model啊对吧,然后咱们回车。啊,那已经解压完毕了,完毕之后呢,我们CD的OD诶这个model嗯,好进来,那进来之后呢,大家来看一下啊,这个就是我们这个麒麟的安卓包,那进在我们要做的呢,就是先诶给它干啥,是不是先给它改名了,对吧?阿帕奇啊ada只留一个麒麟就可以了啊那现在我们进到这个麒麟啊,啊这理论上啊,到现在我们其实就可以干啥了,是不是就可以启动麒麟了,对不对,但是我们这儿呢,还有一步要做啊,哪一步要做呢?
01:02
解决一个兼容性问题。啊,这个兼容性问题是怎么一回事呢?大家还记得我之前在讲氦王SPA的时候给大家提到那个兼容性问题吧,对不对?当时给大家讲了兼容性问题是怎么产生的啊,以及这个兼容问题到底应该怎么去解决,大家还有印象吗?啊,有影响,那现在还能想起来是怎么一回事吗?能不能想起来,好像又想不起来了啊,那想不起来咱们简单回顾一下啊,那兼容性问题到底是怎么产生的,我们还以之前的have on Spark为例啊,那咱们之前啊,之前啊,咱们怎么说呢?说我们集群当中啊,安装的have呢,是3.1.2的have对不对啊,那3.1.2的have在开发的时候,它引入的4SPA克依赖是多少呢?比如是2.3.0的对不对?然后呢,它在开发的过程当中,它引用了一些什么?说演用了一些2.3.0的Spark当中的过期的API,对不对,那我们集群当中部署的Spark是什么版本,是3.0.0啊,那恰好在3.0.0里边将2.3.0的Spark里边的过时API给删除了,对不对?那这样一来的话,就会导致一个什么问题,是不是我们have3.1.2再去加载SPA3.0的依赖的时候,是不是就会出现一些方法找不到啊,对吧?啊,那这个其实咱们所谓的兼容性问题啊,那这个就是咱们兼容性问题的一个原因啊,这是咱们讲之前讲的啊,那当然呢,这个问题应该怎么解决啊。
02:24
怎么解决?是不是我们要想解决应该下载have的源码,然后呢,将SPA依赖改成30.0,然后重新编译,重新打包再安装,是不是就OK了啊,这是一种方式啊,这个是我们兼容性问题的一个原因,一种类型,但其实除了这种情况下会造成这个兼容性问题啊,还有其他的一些情况也会导致兼容性问题,还有哪种情况呢?诶,其实就是麒麟这种情况,什么情况呢?我给大家说一下啊,来大家一起来看啊。来,假如说这个是麒麟,这是咱们的麒麟啊,麒麟假如说他在开发的时候引入了一个依赖A。
03:00
比如说他引入了这个A的版本呢,是一版本。啊,这个大家能理解吧,啊,那除此之外呢,他还引入了另外的一个依赖,比如说引入谁引入了Spark。啊,那麒麟你说它需不需要依赖于Spark,需要对吧,因为麒麟我在计算的时候可以使用MR,也可以使用Spark,对不对,那所以说是不是需要s Spark依赖对吧?那假如我现在呢,诶引入了一个,哎,这个Spark依赖Spark啊,那假如说大家想一想啊,假如说Spark这个框架里边也有A依赖。Spark里边也有A,而Spark当中的A它的版本是多少?是二还是二啊?那OK,这个A杠一和A杠二这两个版本假如说是不兼容的,那什么叫A杠一和A杠二是不兼容的?A-1A杠二这是不是同一个依赖,是不是只是版本不同,对不对?我所说的不兼容是啥意思?比如说就是A杠一里边有一些过时API,在A杠二里边给它删除了,是不是就上下就不兼容了呀,对吧?啊就这个意思啊,咱们理解一下啊,OK,那假如现在的情况就是这样的,OK,那大家试想一下啊,设想一下你说我们现在在启动麒麟的时候会出现什么样的问题?
04:10
你不出什么问题。会什么问题啊,你想啊,那麒麟首先它自己是不是会有一个A的炸包,对不对,那我引到的Spark的这个依赖当中,是不是也会有一个A的炸包,对不对,那是不是会有两个A的大包,那两个A的R包里边的类名是不是一样的,包名类型是不是大部分都是一样的,是这个道理吧?诶那你说我们再往这个JM里边去加载这些类的时候,它是怎么加载的?如果类不相同,不相同,我是不是肯定正常加载就行了,但是在我整个class下面,它有两个或者有多个类,它的包名以及类名是完全一样的,对不对?那出现这种情况,你说他会怎么做呀?他会报错吗?还是怎么做?哎,不是找不到,出现这种情况呢,他会从这两个里边选其中一个。他会选其中一个啊,那具体选谁呢?那实际上呢,是根据这个这个包名的这个名字去选的,根据包名的名字去选的,排在他会排序,应该是字典顺序排序啊,排在前面了,诶我就加载后边的我就不加载了,是这样的啊,那也就是他这里边是不是会加载到一个,呃,相当于是随机对吧,相当于随机啊,相当于会随机去加载一个什么呀。
05:21
是是是不是咱们这个ad带啊,对吧,那假如现在不巧啊,他假的加载的不是他自己需要的这个A杠一,他加载的是谁呢。假如它加载的是Spark当中的A杠二,那这样会出什么问题?是不是刚才说了A杠一跟A杠二之间是有兼容性问题的,对不对?那是不是还是会出现某个类或某个方法找不到这种问题,对不对,这也是兼容性的问题的啊一种情况啊,那这个问题你说我们应该怎么解决?本质上应该怎么解决?咱应该怎么解决?最简单的一个方式啊,这个其实有一个巧法,怎怎怎么办,哎,我这样去做,我可以去修改一下麒麟的启动脚本,修改麒麟启动脚本啊,那怎么去修改呢?那你大家想想啊,你说麒麟它的启动脚本当中是不是肯定会有一些根据环境变量去寻找它所依赖的炸包的这样一个逻辑,对不对啊,那我是不是可以找到这段逻辑,找到这段逻辑呢?我将什么将有冲突的这些炸包我给他排除一下。
06:22
对不对,那也就是我把谁排除在外,比如说我把A杠二给他排除了,排除之后,那你说麒麟是不是就拿不到A杠二了呀,对吧?那拿不到A杠二了之后,那诶那是不是里边只有一个A杠一,那它加载的是不是就只有A杠一了,那这样一来是不是麒麟就能够正常的运行了,诶这是一种方式啊,那还有没有其他的方式呢?有没有其实也有其他的方式,其他的方式怎么做,其他方式咱可以这样做啊叭如说我把这个麒麟的源码下载下来,我把麒麟源码下载下来,下载下来之后呢,我找到这个A依赖,我把他自己的A依赖和Spark的A依赖,他来的版本做一个什么,是不是做一个统一,对不对,他是A杠二,那我把这也改成A杠二,你改成A杠二之后,那麒麟是不是得它肯定会报错对吧?那报错之后是不是咱还是这样去改对吧?那改完之后重新编译,重新打包,那现在我们是不是得到的这个麒麟就是一个呃,使用A杠二依赖的麒麟的呀,对吧?那这样一来,虽然我这个麒麟的克拉斯帕下边同样是有两个A的炸包,但是这两个都是啥?是不是都是A-R,那他爱加载A加载A是不是结果都是一样的啊,这样一来也能解决这个问题啊,是这样的啊,那在我们文档当中,我们是通过哪种方式去解决的呢?第一种方式,因为这个最方便,咱不用不用再去编源码了,对吧?OK,那接下来看一看这个怎么做,那想知道怎么做,首先我们得先找到找到这个先找到我们麒麟在启动的时候。
07:42
去寻找这个相关依赖的那个逻辑对不对啊,是这样的啊,那去哪找呢。肯定是在他的并目录下边,对吧?来我们进到麒麟的并目录里边。进来进来之后你会发现这里边儿有一大堆的这个SH脚本,对不对,然后大家注意观察看这几个。
08:01
来看这个能不能看懂有一个什么found highloop com,电是不是寻找highloop的配置文件路径,对吧?Found h base dependency寻找h base,依赖寻找,还有依赖寻找卡卡依赖,寻找Spark依赖啊这其实就是他寻找依赖的那个逻辑啊好,那现在我们到底是谁跟SPA这个麒麟有冲突呢?其实就是刚才我说的Spark啊,就是Spark里边有一些依赖,跟其麟自己演论依赖是有冲突的啊,那现在我们要修改的其实就是哪个文件是不是就是它对不对,那现在我们打开这个放的Spark depend dependency啊来SPA这个应该是的啊。Spark dependency,然后打开,打开之后呢,我们简单看一下这个逻辑,看看能不能看懂啊,哎,首先来看这儿吧。干啥,是不是就声明了一个变量,然后这个变量没值对吧,然后往下走。再看这个,这在干啥?是不是if-n Dollar Spark home这啥意思?是不是再去判断Spark home这个环境变量它是否为空啊,对吧?是这个道理吧?OK,那现在我们集群当中有没有配SPA home,咱们配了,因为汉王Spark是不是要求咱得配一个SPA home嘛,对吧,还是有的,那有的话他是不是就能拿到,拿到之后是不是就将SPA home的值赋予了SPA home这个变量,对不对,那完之后继续往下走来,接着往下走啊。
09:21
来看这儿,然后呢,在这儿他又判断了一个,这是一个什么呢。是不是判断Spark home下面那个这次路径是否存在啊,对吧,那如果存在,那我不是就继续往下走了,如果不存在呢?如果不存在是不是就Spark not found,是不是就直接干啥的呀?是不是直接就是quit退出了,对吧?退出之后,然后给咱们一个报存信息啊,Spark not found set SPA home,然后或者是干什么,或者让你去run一个b download的SPASH什么意思?是不是要你去执行一个下载Spark这样一个脚本啊,对吧,那也就是说在他的这个呃,根目录下边应该会有一个什么,是不应该会有一个download的SPA,呃,SW那个脚本对不对,但是你看这里边有吗。
10:03
有没有在这儿呢?是不是OK,来这是来下载那个SPA脚本,那当然在那不用它啊,不用打来我们打开,打开之后继续往下走,那假如他现在有SPA后吗?完了之后接下来看看是怎么做的啊,咱们就看这个位置。这段代码看能不能看懂,这是不是有一个Spark depend对不对,完之后呢,后边是不是有一个放的命令,当然放的命令里边。有用什么括起来了是不是用漂号,那也是他会将这个放的命令的结果赋予sparkrk dependency这个变量,对吧?然后看最后,最后呢?啊,一会儿咱们再看最后吧,咱们先看这个逻辑吧,这个逻辑怎么写的,是不是什么found的杠L后边这是啥?就是那个Spark的炸包的路径对不对?然后后面呢,有一个什么杠name完了之后还有什么叹号杠内,叹号杠内这啥意思?杠name是什么意思啊,是不是就是就是就是我要什么样的对不对,我要什么样的,我要星点,这星点是不是所有的炸毛对不对,那叹号杠内呢,就是反过滤对吧?我不要这个SL fo接不要打印日志的炸包,那我不要这个炸包,我也不要这个,我也不要这个。
11:04
能理解吧,啊,其实他就是这样去找他所需要的和不需要的东西的啊,那OK,那现在我们要做的就是市场,那是不是就是根据这个逻辑,把我们不需要的炸包给它过滤掉就行了,对不对,那我们不需要炸包是谁呢?那当然这个呢,你得看到报错信息之后再排查对吧?那在这儿我们就不再去一点点排查了,告诉大家就行了,就是这样的两个炸包来,咱们CTRLC拿过来,拿来之后呢,我给它放进来啊,注意啊,你放的时候是不是得遵循它这个语法才行,你看人家是怎么放的啊。是应该是叹号杠name一个通配,叹号杠内一个通配,这是一个单元对吧,然后要注意啊,两个单元之间有啥是不是有空格那所以大加的时候一定得加,加对地方啊,我加那行不行。不行,对吧,我得加这个叹号前面对不对,这个一定要搞清楚啊好,那现在呢,我来一个粘贴,好,那大家呢,把我们所需要过滤掉的这两个包给它过滤掉就行了,分别是啥?一个是Jack克son的包,杰克son是不是就是也是一个处理杰森的一个包啊对吧?那这个是谁麦store谁的麦,就是还有麦store啊,那这俩东西我们都需要给它过滤掉,这一定要注意一下啊啊那这块咱们过滤完之后,我们再继续往下,实际上咱们现在就改完了,实际上就改完了,我们再继续往下看啊,你看它下边干啥。
12:11
你看下面干啥了啊,那如果说哎,我们已经得到了我们所需要的这些东西了啊,那接下来你看最后。最好再做一个什么操作。是不是做了一个,呃,E export Spark dependency,等于等于啥。是不是Dollar对不对,那这个是啥。这是啥,是不是就咱们这个变量对不对,然后呢,给他干啥了,是不是给他追加到了这个路径下面了。这个路径是啥?Dollar d是不是就当前路径对不对,这里面会有一个什么文件,是一个什么catch的Spark dependency,这个大家能不能理解?他做了一个什么操作啊,是不是就是说只有我们第一次启动麒麟的时候,他才会去执行这个脚本的逻辑,是是这个道理吧,那这个逻辑它执行完之后呢,他会把这个什么,这个获取的依赖的结果写到哪。
13:02
是不写入到这样的一个catchche文件啊,对吧?是这样的啊,那也是我第二次再启动它还会去执行这个逻辑吗?这就不会了,诶他直接找的就是这个文件啊,那这样一来大家需要注意一个什么事儿啊,假如说有同学第一次改这个文件的时候,我这儿改错了,改错了之后你启动之后是不是肯定起不来,起不来之后,OK,你一会儿意识到了,诶我这儿改错了,我再给它改回来,改回来之后你再启动,能启能成功吗?还是不能成功,你得怎么样,得先把cat文件删除,删除之后你再去,呃,重新启动才可以啊,这个一定要注意啊,OK,那咱们shift z啊,好,那这个兼容性问题的说明咱们就完事了啊,OK,好,那改完之后我们继续往下走,下边咱就可以启动麒麟了啊,然后再啰嗦一句啊,启动麒麟之前一定要先启动hi豆op,那hi豆腐里边呢有啥。有HTS,有雅安有job history server,注意历史服务器是不是必须得起对不对,注意啊,启动麒麟之前必须启动历史服务器啊,那为什么呢?这个等我们后续使用的时候我再给大家解释,历史服务器是必须得启的啊,然后呢组我现在历史服务器应该是没起啊,我启一下来我启动历服务器应该怎么起,这该是map right,然后杠杠dae,然后后边来一个start,是不是history so啊对吧,然后咱们回车好启动历史服务器啊OK,那接下来咱就可以干啥了,是不是可以启动麒麟啊对吧?那麒麟怎么起啊,哎,我们点啊,然后呃执行一个B就行啊来BB什么bin下面是不是应该是有一个K麟点SH上对吧?那那呢这个就是起,那停呢,就是K0.sh死到那现在火推车。
14:31
来让它启一下啊啊,第一次启动的时候呢,是比较慢的,第一次启动的时候比较慢的啊,OK,它第一次启动是不是会尝试去加载各种各样的依赖啊,对吧,就比较慢,OK,那咱们稍微等一下啊。稍等一下,等他起来。有些同学呢,在启动的过程当中就会报一些错误,比如说我找不到have的依赖,或者说呢,我找不到HP的态,这可能是怎么回事,是不是可能有环境变量配置有问题啊,对吧,一定要注意一下啊呃,OK,这个启动呢,可能还得一会儿啊,因为他第一次启动比较慢,可能得起个一两分钟啊,那咱们要不就先到这儿吧啊,那现在我们开始上课啊,那接下来呢,我们去检查一下我的麒麟有没有启动成功啊,我们先看一下这个叉C这边啊。
15:14
就是当我们执行启动命令之后呢,它这块是不是会打印一大堆的这个启动日志啊,对吧?啊,你看最底下啊。最底下呢,它实际上会,呃,启动成功之后呢,会给你打印几条日志,咱们来一起看一下啊,说什么呀,说是不是有一个麒麟的实例被艾特硅谷用户给启动了呀,对吧,你要想停就执行,诶点shto啊,然后再往下走,哎,他说让你去哪看日志,说check log at这个路径对不对,咱们要想看日志,你得知道去哪看啊,其实所有的框架都一样啊,你得知道日志在哪,出问题之后你才能排查,对吧?啊好,下一个下一个呢,有一个web UI啊,Web数据那个地址啊,对吧?啊可以看一下这个好记不好记啊。海51027070是不是就是麒麟,麒麟对吧,这一下就记住了,对吧?然后后边呢,还有一个访问,呃资源的路径,麒麟啊,这就是我们将来要访问的这个呃地址啊,然后在这儿呢,给大家稍微说明一下,呃,咱们这儿呢,呃,因为正好咱们这儿启动之后隔了一个中午啊,那如果说大家自己启动的时候,即便是这几条日志出来了,那我们这个麒麟呢,也可能还没有启动成功,它第一次启动的时候呢,需要去部署外部应用,所以说呢,这个时间可能会比较长,如果说打印了这几条日志之后,你去访问页面,你发现这个页面刷新不出来,那OK,你等一会儿,等一会儿它就可以了啊好,那现在我们去访问一下啊,来,我打开这个浏览器,然后CTRLV。
16:35
啊,大家看一下,现在是不是就已经进入到了这个麒麟的工作界面了呀,对吧?那现在呢,我们先登录一下啊,登录是不是得有用户名,得有密码对吧?那他的用户名和密码分别是啥的,往下翻啊往下翻来在这儿是不是的in和K啊对吧?那都是大写的啊那现在呢,我们给他登录一下啊,我在这应该是保存了这个用户名密码的,来现在我是logy,现在我们就已经登录到了这个麒麟的工作界面了,OK啊,那至于这里边到底怎么用啊,我一会来给大家讲啊,OK,那我这儿应该是呃,是没有问题的啊好,那接下来呢,我再给大家说一下,大家自己在启动这个麒麟的过程当中可能会出什么问题,那出问题之后怎么去解决。
17:14
大家最容易出的一个问题呢,就是关于环境变量,大家应该都知道啊,在我们第一次启动麒麟的时候,那这块会怎么样,是不是会给你报一些这个呃什么正在呃寻找这个h base的依赖,寻找这个什么还有的依赖等等等等,对吧,在最开始的时候对吧?那最开始的时候有些同学可能会报错了,说找不到这个依赖,或者是找不到那个依赖啊,如果出现类似似误检查缓境变量能理解吧?哎,这是诶一个小问题,这个大家应该是容易解决的啊,然后还有一个问题就是大家在启动麒麟之后呢?啊,启动麒麟之后,那我打开这个界面啊之后呢,它会跑报一个什么,报一个什么404NOTE found或者其他的一些这个状态码啊,就是它有问题,这个页面不能正常显示,出现类似的问题呢,很有可能是哪儿出错了啊,很有可能是这个兼容性问题,你这改的时候改错了,比如说诶我这改的时候呢,我这个空格前后空格忘了加了,对吧?诶是不是就可能出问题啊对吧?出了这个问题怎么办?刚才说了咱是不是得去改再重新改一下啊,对吧?但是你光重新改它有用吗?是没用的啊,我们现在进到这个B目录里边去看一下。
18:15
哎,大家来看啊,那这儿是不是出现了几个catch的这样的一个SH文件呀,对吧,你需要怎么做,你需要把它删除,删除之后再重新启动啊才可以,这个一定要注意一下啊好,这是第二一个问题,那还有一个问题啊,就是有些同学在期末的时候呢,所有的这个环境都准备好了,哎,什么该起的进程也起了啊,那我这个兼容性问题改的地方也改对了,对吧,环境变量也都配了,那这个麒麟它就是起不来啊,起不来的话它会报一个什么错误呢?他说检查这个have的可用性失败啊,就是have是有问题的,什么意思呢?给大家解释一下啊,那我们还是来看一下这个B目录下的一个脚本啊,那B目录下面呢,实际上有一个这样的一个脚本,大家看一下这什么意思,是不是check have usability啊,对吧,啥意思,是不是检查have的可用性啊,对吧?也就是麒麟在启动之前呢,它会先去啊,通过一个脚本去检查一下你的have现在是不是能用的啊,如果have能用啊,OK,那他就通过,如果have不能用,那直接就退出,并且报错了,OK,那现在呢,我们看一下。
19:15
这个检测的逻辑是什么啊,来check啊,这个have us打开,打开之后呢,其实这块很简单啊,那首先我们看这个位置,再来看这。在这儿他执行了一个什么样的一个命令?看一下是不是就have杠一完了之后呢,来一个什么,来一个是不是谁SELECT1对不对,其实他现在就是在测啥,他是为了选这个一嘛,这不是肯定是为了测什么,测have这个环境是不是OK的对吧?诶它会执行一个这样的一个命令,那当然了,这个命令要想执行成功,你是不是必须得确保还有一点问题没有对吧?这里边有一个小细节需要注意一下,就是关于那个MAS store服务,大家注意观察我这儿我起MAS store了吗?我没起对吧?啊,那有些同学是不是得起。是这个道理吧,你那个起不起是不是得看自己那个have的配置啊,对吧,你得看你的have set当中有没有加上那个MAS到底uri对吧?有那个参数,那此处这个氦我们就得记,那我这儿没有就不用写了,这个大家一定要注意啊啊,那它这呢,就执行了一个C1,然后之后你看下边干啥。
20:13
这是不是声明了一个time left等于60对吧?啊,这啥意思?然后再往下看,下面有一个什么,是不是有一个where循环对不对,是不是先判断判断啥,判断这个time left是否大于零,那如果大于零怎么办?是不是睡五秒对不对啊睡五秒那完了之后呢,是不是去检测一下我上面这个PID啊对吧,这个PID实际上就是谁啊,实际上就是我们have-E这个IPID啊去检测一下,那也就是啥意思呢?它这是不是给了60秒钟啊,然后呢,去执行这个have-E的这个命令,如果在60秒内我能够把这个have杠一执行成功,诶,那你说他会怎么样,是不是就成功了,相当于检测通过,那如果在60秒内没有执行成功,那就会报错,对吧?那报错的话,他怎么报呢?往下看啊,它会报一个这样的错误,说check have usability field,让你去检查你集群的状态啊,是际如果大家遇到这个问题了,那很有可能就是你的have务怎么样,太太慢了,对吧,你比如说你执行have杠一在那一,你一分钟都没执行完IOK,他就报错了,咱们有些同学这个。
21:14
电脑它比较老啊,所以可能会比较慢,诶这样的同学你怎么办啊。怎么办?把这个时间都可以调大一点,对吧,你60不行,你给他调成600呗,对吧,600要再不行,那那那6000那就只能6000了,你这东西你也也不值当换个电脑对吧?啊,如果有类似的问题,大家记得这样调一下就行了啊啊那这个呢,就是大家以后可能会遇到的一些问题啊,行了,那这个麒麟的启动啊,其实就没有其他内容了,然后再给大家提个醒,有些同学呢,他在启动麒麟的时候,他可能会忘记启动历史服务器。啊,可能会忘记启动历史服务器啊,然后给大家说一下,其实我们在启动麒麟的时候,你这个历史服务器不起也没事。啊,你就是不起历史服务器,你应该能发现我这个麒麟也是能够启动成功的,但是什么时候它就成功不了了呢?在我们后续去做计算的时候,如果你没起历史服务器,那这个计算它就成功不了,也就是说实际上这个历史服务器是什么时候用的呀?是麒麟,麒麟在做计算的时候用的啊,也就是说你比如说一开始忘了,现在给他再启动起来也没问题啊好,那到底它为什么去使用这个例服务器,到底用它干啥?等后续我再给大家解释啊,好,那我把视频停一下啊。
我来说两句