Mei笑D小妞 发表于 2016-12-9 10:58:03

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

http://caibinbupt.iyunv.com/upload/attachment/61545/bd7231af-7b23-3107-bc59-c94f93597d52.jpg
 
 
 
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。
页: [1]
查看完整版本: Hadoop源代码分析(二五)