Hadoop NameNode启动之PendingReplicationMonitor(四)
2013-08-24 11:43
267 查看
PendingReplicationMonitor为PendingReplicationBlocks的内部类,先看PendingReplicationBlocks,主要记录被复制的块,周期性的检测块复制请求,主要维护以下几个变量:
private Map<Block, PendingBlockInfo> pendingReplications; private ArrayList<Block> timedOutItems; Daemon timerThread = null; private volatile boolean fsRunning = true;
检测时间的间隔默认为5分钟:
private long timeout = 5 * 60 * 1000; private long defaultRecheckInterval = 5 * 60 * 1000;
在创建PendingReplicationBlocks的时候会启动周期检测进程,由实现Runnable的PendingReplicationMonitor类实现:
void init() { pendingReplications = new HashMap<Block, PendingBlockInfo>(); timedOutItems = new ArrayList<Block>(); this.timerThread = new Daemon(new PendingReplicationMonitor()); timerThread.start(); }
下面看下周期监控线程的实现:
class PendingReplicationMonitor implements Runnable { public void run() { //在namenode运行期间一直检测 while (fsRunning) { long period = Math.min(defaultRecheckInterval, timeout); try { pendingReplicationCheck(); Thread.sleep(period);//检测间隔 } catch (InterruptedException ie) { FSNamesystem.LOG.debug( "PendingReplicationMonitor threadreceived exception. " + ie); } } } /** *注意这里是一次性检测所有被复制的块,并且是线程安全的 */ void pendingReplicationCheck() { synchronized (pendingReplications) { Iterator iter = pendingReplications.entrySet().iterator(); long now = FSNamesystem.now(); FSNamesystem.LOG.debug("PendingReplicationMonitor checking Q"); while (iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); PendingBlockInfo pendingBlock =(PendingBlockInfo) entry.getValue(); if (now > pendingBlock.getTimeStamp() + timeout) { Block block = (Block)entry.getKey(); synchronized (timedOutItems) { timedOutItems.add(block);//如果复制超时,则加入timedOutItems } FSNamesystem.LOG.warn( "PendingReplicationMonitor timed outblock " + block); iter.remove(); } } } } }
在主类里主要维护了pendingReplications和timedOutItems两个数据结构,如果有新的块需要复制,则通过add和remove来操作pendingReplications,这两个函数都是线程安全的,每次操作时都会锁住整个链表,但因为这种操作并发量不是很大,所以也不会对性能造成太大影响。
相关文章推荐
- HDFS集群的启动(6)——NameNode任务线程之PendingReplicationBlocks$PendingReplicationMonitor
- HDFS集群的启动(7)——NameNode任务线程之FSNamesystem$ReplicationMonitor
- Hadoop NameNode启动之HeartbeatMonitor ( 五)
- Hadoop NameNode启动之LeaseManager$Monitor(六)
- hadoop2.0之HDFS集群管理:PendingReplicationMonitor
- Hadoop NameNode启动之DecommissionManager$Monitor(八)
- NameNode任务线程之PendingReplicationBlocks$PendingReplicationMonitor
- hadoop namenode无法启动,提示 java.net.unknownhostexception 的解决方法
- hadoop namenode 启动问题
- hadoop namenode多次格式化后,导致datanode启动不了
- hadoop初识之八:NameNode 启动过程和secondaryNameNode 作用
- Hadoop之——执行start-all.sh时namenode没有启动
- hadoop2.5.2学习及实践笔记(四)—— namenode启动过程源码概览
- hadoop 的HDFS 的 standby namenode无法启动事故处理
- hadoop之端口被占用问题namenode无法启动
- Hadoop的NameNode无法启动解决方法
- Hadoop HA——namenode无法启动问题解决
- Hadoop中namenode无法启动
- Hadoop的NameNode无法启动异常
- hadoop中启动datanode或者namenode没有启动起来