继续对FSNamesystem进行分析。
Daemon hbthread = null; // HeartbeatMonitor thread
public Daemon lmthread = null; // LeaseMonitor thread
Daemon smmthread = null; // SafeModeMonitor thread
public Daemon replthread = null; // Replication thread
NameNode上的线程,分别对应DataNode心跳检查,租约检查,安全模式检查和数据块复制,我们会在后面介绍这些线程对应的功能。
volatile boolean fsRunning = true;
long systemStart = 0;
系统运行标志和系统启动时间。
接下来是一堆系统的参数,比方说系统每个DataNode节点允许的最大数据块数,心跳检查间隔时间等… …
// The maximum number of replicates we should allow for a single block
private int maxReplication;
// How many outgoing replication streams a given node should have at one time
private int maxReplicationStreams;
// MIN_REPLICATION is how many copies we need in place or else we disallow the write
private int minReplication;
// Default replication
private int defaultReplication;
// heartbeatRecheckInterval is how often namenode checks for expired datanodes
private long heartbeatRecheckInterval;
// heartbeatExpireInterval is how long namenode waits for datanode to report
// heartbeat
private long heartbeatExpireInterval;
//replicationRecheckInterval is how often namenode checks for new replication work
private long replicationRecheckInterval;
//decommissionRecheckInterval is how often namenode checks if a node has finished decommission
private long decommissionRecheckInterval;
// default block size of a file
private long defaultBlockSize = 0;
private int replIndex = 0;
和neededReplications配合,记录下一个进行复制的数据块位置。
public static FSNamesystem fsNamesystemObject;
哈哈,不用介绍了,还是static的。
private String localMachine;
private int port;
本机名字和RPC端口。
private SafeModeInfo safeMode; // safe mode information
记录安全模式的相关信息。
安全模式是这样一种状态,系统处于这个状态时,不接受任何对名字空间的修改,同时也不会对数据块进行复制或删除数据块。NameNode启动的时候会自动进入安全模式,同时也可以手工进入(不会自动离开)。系统启动以后,DataNode会报告目前它拥有的数据块的信息,当系统接收到的Block信息到达一定门槛,同时每个Block都有dfs.replication.min个副本后,系统等待一段时间后就离开安全模式。这个门槛定义的参数包括:
l dfs.safemode.threshold.pct:接受到的Block的比例,缺省为95%,就是说,必须DataNode报告的数据块数目占总数的95%,才到达门槛;
l dfs.replication.min:缺省为1,即每个副本都存在系统中;
l dfs.replication.min:等待时间,缺省为0,单位秒。
SafeModeInfo的类图如下:
threshold,extension和safeReplication保存的是上面说的3个参数。Reached等于-1表明安全模式是关闭的,0表示安全模式打开但是系统还没达到threshold。blockTotal是计算threshold时的分母,blockSafe是分子,lastStatusReport用于控制写日志的间隔。
SafeModeInfo(Configuration conf)使用配置文件的参数,是NameNode正常启动时使用的构造函数,SafeModeInfo()中,this.threshold = 1.5f使得系统用于处于安全模式。
enter()使系统进入安全模式,leave()会使系统离开安全模式,canLeave()用于检查是否能离开安全模式而needEnter(),则判断是否应该进入安全模式。checkMode()检查系统状态,如果必要,则进入安全模式。其他的方法都比价简单,大多为对成员变量的访问。
讨论完类SafeModeInfo,我们来分析一下SafeModeMonitor,它用于定期检查系统是否能够离开安全模式(smmthread就是它的一个实例)。系统离开安全模式后,smmthread会被重新赋值为null。