Hadoop NameNode启动的资源检查
目录
回顾
上一篇分析了Hadoop的Rpc服务,这一篇将接着往下分析startCommonServices这个方法,先看代码整体的流程。
startCommonServices
主要是两步:
-
namesystem.startCommonServices
-
rpcServer.start();
FSNamesystem
FSNamesystem是NameNode核心成员变量用来管理元数据(实现对DataNode、Block的管理以及读写日志),FSNamesystem的startCommonServices将启动一些磁盘检查、安全模式等一些后台服务及线程。
1、将需要检查的URL添加到volumes中 , 后台有线程会一直执行hasAvailableDiskSpace来检查
2、checkAvailableResources(); 进行资源检查
3、NameNode启动,进入到safemode阶段,处于一个等待汇报blocks的状态
4、汇报所有的block,用于后面判断是否进入安全模式
5、**BlockManager
先new一个NameNodeResourceChecker,我们进入构造方法
这个构造方法主要是:
1、声明namenode容忍的磁盘大小的阈值
2、封装好需要检查的磁盘路径(fsimage和edits)
3、将需要检查的磁盘路径通过addDirToCheck方法添加到volumes这个map集合里面,然后在FSNameSystem中有一个NameNodeResourceMonitor线程,不断的调用checkAvailableResources方法来检查volumes(磁盘的资源情况)
NameNodeResourceMonitor
FSNamesystem的内部类,实现了Runnable,在这里是后台线程,不断检查资源的情况。
NameNodeResourceChecker
NameNodeResourceChecker是实际资源检查的类,调用的是类里面的hasAvailableDiskSpace方法,监控NameNode主机上的磁盘还是否可用。如果一旦发现有资源不足的情况,会使NameNode进入安全模式。如果随后返回的状态代表资源大小到达可使用的级别,那么这个线程就使NameNode退出安全模式。依照这个注释,去解读run()方法的代码逻辑:在一个while循环里,首先判断资源是否可用,如果不可用,日志里就会发出一个警告信息,然后调用enterSafeMode();进入安全模式。
总结
从上面分析可知,这一篇主要介绍分析了NameNodeResourceChecker类的构造和线程类NameNodeResourceMonitor的run方法的资源检查。
欢迎扫描关注我的公众号!