Hadoop源代码分析(二五)

继续对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的类图如下:



 

 

 

thresholdextensionsafeReplication保存的是上面说的3个参数。Reached等于-1表明安全模式是关闭的,0表示安全模式打开但是系统还没达到thresholdblockTotal是计算threshold时的分母,blockSafe是分子,lastStatusReport用于控制写日志的间隔。

SafeModeInfo(Configuration conf)使用配置文件的参数,是NameNode正常启动时使用的构造函数,SafeModeInfo()中,this.threshold = 1.5f使得系统用于处于安全模式。

enter()使系统进入安全模式,leave()会使系统离开安全模式,canLeave()用于检查是否能离开安全模式而needEnter(),则判断是否应该进入安全模式。checkMode()检查系统状态,如果必要,则进入安全模式。其他的方法都比价简单,大多为对成员变量的访问。

 

讨论完类SafeModeInfo,我们来分析一下SafeModeMonitor,它用于定期检查系统是否能够离开安全模式(smmthread就是它的一个实例)。系统离开安全模式后,smmthread会被重新赋值为null

你可能感兴趣的:(thread,hadoop)