00:00
好,接下来我们来看一下第一章name notde的一个启动源码,那我们之前啊,在讲这个基础阶段的时候,其实给大家讲过name node和secondary name node的一个工作机制还记得吧,对吧?那我们简单回顾一下哈,呃,首先呢是客户端name notde,那name notde在一启动之后呢,它先加载了一个编辑日志和镜像文件到它对应的这个内存当中,对吧?然后等待客户端对它进行一个访问,那访问之后,然后滚动操作日志,然后后面诶,在内存上进行一个操作之后呢,Secondary内note进行后续的一个工作啊那这里面这个tonn呢,我们就暂时先不说它了,OK吧,哎,之前呢,我们只是把这个最核心的内容给大家讲了,那这次我们讲源码呢,给大家讲的更深刻一些哈,我们要给大家讲述内容呢,是它启动之后。要启动一个9870对应的端口,这端口大家不陌生吧,对吧,就相当于你看我这集群啊,我启动之后,我说访问的就是9870啊,来到这个页面啊,OK,那它得启动对应的这个服务,然后呢才是加载镜像文件和对应的编辑日志到内存当中。
01:07
那再往下呢,其实它还超出这个初始化了一个NN的RPC服务端。因为我是一个内闹的,他得允许客户端对我进行来访问,那我服务端对象是不是得开启啊。对吧,诶这个它也需要开启,那同时呢,其实这个NN呢,它还做了另一件事,叫启动支援的一个检查。哎,他刚启动之后呢,它会检查你这个aid,嗯,这个aid编辑日志和镜像文件对应的这个存储路径上,它能存储多少数据。你想啊,我这边这个客户端会源源不断的对他进行访问,产生大量的这个编辑日志。那么如果你这个吃饭路径存不下我对应的这个数据,那后期不麻烦了吗?所以说他要提前进行一个检测。OK吧,那这个呢是100兆,嗯,好,那再往下呢,是后面这个是哎,Name notde心跳,哎心跳超时一判断,还记得这个name node和data notde一个工作机制吗?
02:03
按DN邀请他进行一个注册,同时还会周期性的向内note发送心跳。对吧,那发送过来的心跳name no呢,是不是还要判超时啊?哎,因为它会确定这个data node它是否是活着。还记得那个时间参数标准是多少了吗?十分钟加30秒吧,有印象吗?哎,十分钟加30秒这个参数OK,那还有一个呢,就是这个安全模式,比如说内蒙note刚启动的时候,大家清晰的记得这个印象来。看一下这张图当中,这张图当中是不是这刚开始启动的时候,这个地方是安全模式是打开状态啊。对吧,哎,等待这个一段时间之后啊,然后所有的块都已经上报完毕了,然后他才退出安全模式,这个在再讲安全模式的时候啊,大家也有印象,行,那这就是内的初始化要做这么六件事,好,那我把这个图呢给它截下来哈。OK,接下来这张图之后,我们就按照这个事情啊一下这样往下走,那往下走之前啊,这个代码量呢,非常大啊,我先给大家一个整体上的一个印象啊,我们未来要看的代码呢,哎,马上呢就是啊要走这一套,那你要看的是内弄的启动,你是不是得看他的main方法呀。
03:16
对吧,Name notde啊,它没方法,然后呢,这里面要创建name node啊,然后用了一个name note对象,然后在name note用到一个name not对象,之后是初始化方法。对吧,要初始化这些内容。那第一件事呢,就是启动这个对应的9870服务吧,嗯,好,那走呗,你看启动服务它掉了这么多事。来,我们后面一个一个看啊,别着急,然后再往下,下面呢是加载镜像文件,哎,执行了这些代码再走,哎,初始化RPC。启动资源检测啊,以及呢,DNA的一个心跳判断。账号。安全模式的一个检查。OK吧,那这里面呢,我带大家啊,一个一个看啊,我先看这个,那我就把这个呢盯出来。
04:02
哎,看哪一个就盯哪一个。这样呢,大家就不乱了哈,好把这个关掉。把这个呢,可以收一下。对了吧,那下面呢,我们就呃看之前还得需要做一个准备工作啊,这里面呢,你以前只是导了一个hi doop APS对吧,那你想看内note,你还需要导一个这个配置文件,就是hi do APS客户端。哎,把这个依赖加载进来,那就能看到这个name note了,OK吧,那全集查找ctrl n name note啊,然后呢,进入到这个页面,那下面来操作一下哈。呃,首先来到这里面,Ctrl n name node进来。进来之后你要查找,哎,查找它对应的main方法。那从may开始执行,那往下走,你看一下这段代码当中哪一个是比较有用的,那肯定是创建name note OK,往下看,别着急。放那不到接往下找,哎往下找找谁呢。诶,你看哪个像啊,什么format name not format,哎,还不是还不是还不是,哎,最后一个往下走,走到default的时候,他最后返回了一个,拗了一个name not对象。
05:10
对吧?哎,这是我们要看的哈,你有内的对象,那你就看一下name not呗。点进去,点进去呢,这是一个this,好,那不就他吗?嗯,好,那然后这里面继续往下看看他干了哪些事好吧。往下走。初始化对吧,哎,进行初始化,进来初始化之后往下看看它干什么事儿,第一件事儿就是启动at TB服务对吧,那好,那就进呗,进去。进来之后你看,哎,这里面有一个谁呢?哎,HP server,然后你有了一个什么对象,然后呢,这个服务呢,进行一个启动。啊,要启动这个对象,那行,你要想启动这个对象,那看一下它启动的这个服务的端口号是多少,进到这,进到这之后呢,你再往下走绑定对吧,然后再走。再走之后呢,这是K,这是对应的默认值,看默认值。
06:02
是他吧,默认值default。在default。看到了吗?哎,点了一顿神点之后来到这儿,发现呢,他这个端口号是9870。哎,这个呢,就是我们现在看到的这个外部页面对吧?哎,把这个服务开起来之后,那你这个页面才允许咱们用户进行一个访问。OK吧,哎,所以说它初始化的时候,把这个服务先打开了,那么往回退啊,别着急啊,一点点往回退。开源码呢,还是比较痛苦的哈,往回走往回走,哎走到这儿对吧,哎走到这儿呢,是看到了对应的这个洞号,然后下面这个服务是不是开始启动啊,哎启动。那你看它启动的是哪一个服务啊,往下看看到吗?这有一个http server two,其实正常那个GDK啊,它是有一个htp server的。那这里面hi do呢,它对ATP server呢,又进行了一个封装,所以说产生了新债的对应的ATP serve two。啊,你你们也可以哈,比如说你们一般这个改了一个什么叫麦什么什么对不对啊,什么麦这个客户端client啊,或者MY什么这个呃shower啊类似的哈,一样的道理哈。
07:08
那行,那创建一个他那他他干了什么事呢?往下看a DB server对吧,A d server,然后这个地方。看啊,这个server把它到这个。哎,你学Java的同学知道这个serve light是干嘛的哈,你点开之后你会发现,哎,这里面,诶这个a server呢,它绑定了多个server。哎,相当于啊,你看这有什么这个呃,Em email啊,这个还有磁盘刷鞋啊等等,其实它绑定的是你对这个页面上,哎,这些路径啊,啊,或者页面进行一个相关操作,那我对方能够收到相关的一个响应操作啊,是这块哈,行,那这块呢,就是http server啊相关的一个事情啊,比如说启动9870对应的端口服务,那接下来我们再往下看啊,回来哈。启动完服务之后,我们还做了什么事呢?往回走。这就。往回走。
08:00
向回走,哎,来到这对吧,哎,这是启动这个,呃,GP server,那往下面呢看这个叫load name system,嗯,当前的方法在哪,你要你要看清楚啊,是在初始化里面啊初始化啊load name system是不是加载镜像文件呢。看没加载镜像文件,那再往下说,Load from disk是不是从磁盘上来加载镜像文件,那再往下走。那你的镜像文件,那我就得创建一个镜像文件呢,又来一个镜像文件,但是你看好了,他创建镜像文件的时候,他干了什么事哈。按name space是不是name note,哎对应的这个存储地址,然后还有这谁呢,是不是就编辑日志啊,哎,这就是对应的这个镜像文件和编辑日志对应的路径,它在创建的时候,你看创建的时候,创建的时候呢,一个呢是编辑日志对吧?哎编辑日志对应的存储路径,还有一个呢是镜像文件,哎对应的这个存储路径。哎,这么两块他都进行了一个相关的一个操作,OK吧,啊进行一个存储啊,那反过来。
09:04
这是呢,呃,镜像文件,然后接下来呢,这块呢,就是加载看漏的镜像文件,其实它的这个镜像文件里面就包括了镜像文件和对应的编辑日志。对吧,来那是这块啊,加载启动的时候加载了它,那再往回来。回来之后还是回到这个初始化方法啊,回到初始化,然后初始化方法下面往下走看这块儿。叫创建RPC,比如说你内部弄的是一个服务端,你得把这个服务开起来,允许客户端对它进行一个后续的访问,那好进来。那你既然是服务端,我们说得找到服务端对应的这个特征啊,服务端什么特征。刚才我们讲RPC的时候还记得吗?看一下这块。服务端是不是就是又一个rpc builder对吧,产生一个服务。然后后面的话,这个客户端就允许对我进行访问了,对吧,这里面有对应的协议,还有自己的实例对象啊,对应的这个服务器地址以及端口号。是吧,哎,这个是非常一样的啊,一样的,这就这一块吗?这不是客户端吗?对吧,服务端长成样这样。
10:06
用了个服务啊,服务器地址,端口号,协议以及实例对象啊,好一样的。那么回回过头来。啊,得回去啊。到这。往下找。是吧,哎,这是找到了对应的这个,嗯,服务,那接下来我们再往下看,哎,下面呢,是这个启动NN资源的检测啊,那像这个我再退回来。在哪儿呢?这要初始化,哎也下面我要走的是啥呢?哎,走到这儿之后往下走,哎,至于往下往哪走哈,哎给你们来一个技巧啊,我这边有图。你可以看这块儿。现在我们说说这个刚才走到这个RPC了,哎,那接下来我们要走的是不是下面这块啊。哎,你这样去做就好好弄了。
11:00
啊。下来,哎,你就不会晕了,现在呢,我们说start这个common service对吧,哎,启动资源检测,那好进来。进来之后我把这个数想一下啊。啊,放在这,那进来之后呢,接下来进到的是这个start common service啊进到这。进到这呢,然后往下找,找到一个谁呢,叫name node resource tracker,你看我这图上已经标出来了,在这了吗?是吧,Name no result checker好,那进去呗。进来之后,这里面判断一下这两个参数的值,看一下它是谁,叫default DFS name node,哎,它的一个存储空间,相当于是你启动这个。嗯。启动内之后,他要检查你对应的镜像文件和编辑日志,它的路径上能存储多少内容。对吧,你这个路径哎,它大默认大小的是100兆,如果你第100兆的话,他后面会给你发一个警告,说你这个存储空间不足啊,啊刚才已经给大家解释了,如果说你这个编辑日和镜像文件这个存储空件不足的话,那你后面你看客户端对我进行访问操作,那我这存不下了,那集群不得他了吗?因为这个路径的事他了,那就得不偿失了哈。
12:17
那这是这块啊,那回头来。这是呢,哎,判断一个阈值对吧先。定义好了你预值那阈值之后呢,下面是真正的进行一个磁盘检测看啊走到这啊,你就可以走这条分支了哈,走这条分支,那走到这之后呢,再往下呢,是has啊,是否有存储空间啊,再往下找到它对吧?嗯,继续判断,继续判断之后往下找,你看我们来到哪了,是不是得找这个啊,嗯,找这个资源是否啊,这个够用。嗯,往下找。到这对吧,这块呢,是判断这个资源是否够用的。那你看哦,它是一个接口,那你退回来啊,CTRL2加B。那这样呢,就找到这个呃,方法的实现类了,那这里面找第一个track啊磁盘检测磁盘的,那检测磁盘之后呢,这里面有一个什么方法呢?你这有这个方法看。
13:10
说你这个空间啊,这个实盘空间啊,它is available啊,然后呢,呃,说这个呃,Which is below conig啊,也是你的配置信息啊,不够用,那这块呢,就会在这个控台上啊,看到相关的这个磁盘空间不足的这个信息,OK吧,那行,那这块呢,就是诶对磁盘空间相关的一个检测。那接下来我们再往下走呢,就是对这个内蒙诺的心跳以及安全模式一个检测判断,那你还是把这张图拿过来。哎,把这一钉就OK了。好吧。那往回退啊,往回退,往回走,往回走走走。嗯,再往回走。嗯,走到这儿。再往回一点行啊,回到这儿啊,回到这个最初始化的时候,然后往下往里面进,进到这儿,进到这儿之后呢,刚才我们走的是它对吧?啊,然后呢,你继续进来,进来之后,呃,我们刚才走的是磁盘检测,检测完之后来到这个地方叫block manager啊active进到这进去。
14:17
进去之后呢,往下哪看呢?哎,这里面先进它叫data note manager者比是管理你name note和data note之间进行相互通讯的一个管理者,那看他干了什么事。看到了吗?叫心跳的一个管理者,专门管理你相关的一个心跳信息,那好,那我们就看一下他怎么管理的,那说一下这个心跳这个线程启动。对不对,那你启动线程这个star的方法,那怎么来判断这个代码在哪走呢?是不是得查找它对应的run方法呀。这是线程的一个基本使用方式啊,比如说调用线程调用start,其实走的是它对应的run方法,那好,那你CTRLF。Run。对吧,来找到这儿,那这里面就是刚才启动的这个心跳检测的一个线程,那看在这里面他干了什么事呢?哎,在这里面往下看。
15:07
这里面要找这个心跳检查这。看到没?Heartbeat这个名字起的还非常好的哈,Heartbeat check,那进。呃,心跳检查,他怎么检查的呢?往下找找这个地方。哎,这里面哎,它会遍利这个每一个DN,他会判断这个DN是否还活着啊,那这里面叫是否他已经死掉了。啊,那这个史料的标准是多少呢?还记得咱们之前说的叫十分钟加30秒吗?那看看它是不是十分钟加30秒哈,你看这是上次获取的时间,如果小于当前时间,减去你这个阀值。那它就死掉了,那看一下啊,那这个值是多少,CTRLCCTRLF查找。那这里面是二乘以它加上它,那首先你看一下它是多少啊好。然后呢,你CTRLCCTRLF。看到了吗?
16:00
是五分钟啊,二乘以五分钟是不是等于十啊,哎,这是这块是十分钟,大家来回过头来回。回到这二乘以五等于十分钟了,那这个就一定是30秒,你看十乘以它,那这是毫秒值,干掉三个零,那现在变成秒,这是十秒,那它如果是三的话,那是不是就对了,那看一下它是不是三啊。点进去。是这个值吧,那看这里面它有对应的default默认值,默认值多少,是不是三呢?哎,也就是说它判断一个date诺节点挂掉的标准呢,就是十分钟加上30秒,好,那再回来。啊,回。这个心跳我们就搞定了哈,你看这块是心跳,那接下来我们再来看呢,就是这个地方。哎,就是它你可以往回再退一层啊,让你们再看清楚一点,你看一下再往前退,我一般就给你建议给你退到这个初始化这地方,哎,回到这个初始化对吧?哎回到初始化,回到初始化之后呢,你往下看还是common啊,然后再进来,进来之后呢,来到这个位置啊,还是块管理者,然后active active之后呢,然后来这叫save mode。
17:07
对吧,C Mo的一个管理者,那c Mo不就是安全模式吗?那看他怎么管理的哈,进来。进来之后,进来之后呢,你看这里面有两个分支啊,一个是它,一个是它,那下面这个分支呢,说是进入安全模式,这个呢,Live安全模式是不是离开呀,那取决于什么,是不是取决于它,取决这个条件吧,好,那取决这个条件之前你先看一下它。这里面有个side block total啊,什么含义呢?看看就知道了。进来之后,这里面有一个偷偷乘以他,也就说总的这个块乘了一个这个百分比,这个百分比是多少呢。看一下。Con c。啊,等号F啊。这个是你们一个非常熟悉的值,找到这了,对吧,这是对应它的负值吧,这是一个常量啊。看到了吗?0.9993个九的F。对吧,哎,这个是块什么意思,比如说你总大所有的块当中就1000个块吧,有1000个块当中。
18:05
如果有一个块没启动,是不是允许我正常启动啊?对吧,但是如果说有两个块没有启动,那是我就不能启动了。是这样吗?哎,这个是一个阀值哈,嗯,阈值啊阈值啊OK,行,那回头来啊,这是这个值,咱们之前也给大家讲过,那回来。回来那大家看到的是它,那其实呢,这块你把它关掉啊。说它呢是0.999,那它其其实最终返回的啊是这个这个值啊用的是它,那它呢是取决于这个,那这个值是多少呢?你再看一下。看到吗?这个值其实它的默认值是谁呀,默认值就是这个时代的后啊,也是0.9999啊,这个能懂吗。啊,回来。它俩值是一样的,那行,那这个呢,是设置完这个阈值0.99之后,那下面就是进入到这里面进行真正的一个判断,判断它是否会进入安全模式,还是离开安全模式好进。
19:03
那进到这里面说这个这有一个判断啊,刚才这个还记得吗?啊,Block th hold。哎,这个阀值,那这里面是有一个安全的块,什么叫安全的块呢?就是你正常已经启动的块是否大于了你对应的这个阈值。啊,你假如说还是有1000个画。你已经启动了啊,假如说这个九百九十九九。对吧?哎,那我这个阈值方,我这个阈值是不是999啊,对吧,我总共所有的肿块是1000个,那我这个阈值乘以这个0.999之后,是不是999啊,那如果我启动的块呢,已经大于了这个9999,那数不能正常启动,如果是998数据不能启动。啊,就这道理哈,那它后面还有一个谁呢,叫date note number,就是你date note启动了多少个啊,其实这个date note这个启动多少个呢,它默认是零,就是这个分支呢,它不会进来。哎,除非你去这个设置这个值啊,修改了那才会进来,所以说正常判断的这个条件呢,是不生效的,那只有这个这个值啊是生效。
20:01
好吧,啊,也就是说你启动多少块啊,会进入到安全模式。行,那这个呢,就是呃安全模式相关的一个判断,那至此呢,整个这个诶内蒙诺的启动流程也就完事儿了,那你稍微回顾一下,即使启动的时候呢,就做了这么几件事儿,第一件事呢,是启动了一个呃9870这个服务啊,之后呢,是加载了对应的镜像文件,再之后呢,启动RPC服务啊,然后呢,对NN资源的进行一个检测,那检测标准呢是呃100兆,你这个目录呢,低于100兆,那它就会在空台上对你进行一个打印报警,那再之后呢,是心跳的一个检测,心跳呢,如果你data note上报的信息诶超过了十分钟加30秒,那它就会挂掉,那再有呢,安全模式,诶你这个启动的这个块啊,啊,这个没有达到这个呃相应的这个阈值的一个标准,那么我就会进入到安全模式啊,这个之前也给大家讲过是吧?行,这就是整个这个name note启动流程相关的事儿,那如果在面试的时候,你要不要把这些方法咔咔咔给面试官全说出来,全写出来。啊,你做不到啊,包括我也做不到啊,其实没有必要对吧?哎,关键时刻怎么办。
21:03
面试官说你看过看没看过这个源码啊,啊说看过,那你你还记得点啥事不?哎,如果你正常情况下能把这么六件事儿啊给他说出来就行了,你说我起我能记住,说他启动了这个九八清零服务,呃加载的镜像文件和编辑日志,同时启动了RP服务,然后呢,对这个N的这个资源进行了检测啊,还对这个呃带动的心跳进行了校验,以及呢,判断是否进入安全模式啊做了这些事,如果面试官还不熟的话,那怎么办?你说面试官行,你把你你借一个电脑啊,把你电脑借给我啊,咔咔咔,给他一点是不是就行了啊,就这么简单啊。
我来说两句