首页 百科知识 源代码分析(二五)

源代码分析(二五)

时间:2024-09-22 百科知识 版权反馈
【摘要】:继续对FSNamesystem进行分析。Daemonhbthread = null;// HeartbeatMonitor thread publicDaemon lmthread = null; // LeaseMonitor threadDaemon smmthread = null; // SafeModeMonitor threadpublic Daemon replthread = null; // Replication thread NameNode上的线程,分别对应DataNode心跳检查,租约检查,安全模式检查和数据块复制,我们会在后面介绍这些线程对应的功能。volatileboolean fsRunning = true; longsystemStart = 0;系统运行标志和系统启动时间。系统启动以后,DataNode会报告目前它拥有的数据块的信息,当系统接收到的Block信息到达一定门槛,同时每个Block都有dfs.replication.min个副本后,系统等待一段时间后就离开安全模式。

继续对FSNamesystem进行分析。

 

  Daemonhbthread = null;  // HeartbeatMonitor thread

  publicDaemon lmthread = null;   // LeaseMonitor thread

 Daemon smmthread = null;  // SafeModeMonitor thread

public Daemon replthread = null;  // Replication thread
NameNode上的线程,分别对应DataNode心跳检查,租约检查,安全模式检查和数据块复制,我们会在后面介绍这些线程对应的功能。

 

  volatileboolean fsRunning = true;

  longsystemStart = 0;

系统运行标志和系统启动时间。

 

接下来是一堆系统的参数,比方说系统每个DataNode节点允许的最大数据块数,心跳检查间隔时间等… …

 //  The maximum number ofreplicates we should allow for a single block

  privateint maxReplication;

 //  How many outgoing replicationstreams a given node should have at one time

  privateint maxReplicationStreams;

  //MIN_REPLICATION is how many copies we need in place or else we disallow thewrite

  privateint minReplication;

  //Default replication

  privateint defaultReplication;

  //heartbeatRecheckInterval is how often namenode checks for expired datanodes

  privatelong heartbeatRecheckInterval;

  //heartbeatExpireInterval is how long namenode waits for datanode to report

  //heartbeat

  privatelong heartbeatExpireInterval;

 //replicationRecheckInterval is how often namenode checks for newreplication work

  privatelong replicationRecheckInterval;

 //decommissionRecheckInterval is how often namenode checks if a node hasfinished decommission

  privatelong decommissionRecheckInterval;

  //default block size of a file

  privatelong defaultBlockSize = 0;

 

  private int replIndex =0;
neededReplications配合,记录下一个进行复制的数据块位置。

publicstatic FSNamesystem fsNamesystemObject;
哈哈,不用介绍了,还是static的。

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


mhtml:file://I:\技术文章下载\2010-4-23整理到notebook\Hadoop汇总2010-4-22\Hadoop源码分析\Hadoop<a href=源代码分析(二五)%20-%20-%20JavaEye技术网站.mht!http://caibinbupt.javaeye.com/upload/attachment/61545/bd7231af-7b23-3107-bc59-c94f93597d52.jpg">
 

 

 

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


免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈