hadoop 2.6.0 hdfs ReplicationMonitor 源代码分析

来源:互联网 发布:手机按键屏蔽软件 编辑:程序博客网 时间:2024/05/27 20:17

ReplicationMonitor每一段时间执行computeDatanodeWork,processPendingReplications,然后再sleep一段时间。

private class ReplicationMonitor implements Runnable {    @Override    public void run() {      while (namesystem.isRunning()) {        try {          // Process replication work only when active NN is out of safe mode.          if (namesystem.isPopulatingReplQueues()) {            computeDatanodeWork();            processPendingReplications();          }          Thread.sleep(replicationRecheckInterval);        } catch (Throwable t) {          if (!namesystem.isRunning()) {            LOG.info("Stopping ReplicationMonitor.");            if (!(t instanceof InterruptedException)) {              LOG.info("ReplicationMonitor received an exception"                  + " while shutting down.", t);            }            break;          } else if (!checkNSRunning && t instanceof InterruptedException) {            LOG.info("Stopping ReplicationMonitor for testing.");            break;          }          LOG.fatal("ReplicationMonitor thread received Runtime exception. ", t);          terminate(1, t);        }      }    }  }

computeDatanodeWork的代码如下:

/**   * Compute block replication and block invalidation work that can be scheduled   * on data-nodes. The datanode will be informed of this work at the next   * heartbeat.   *    * @return number of blocks scheduled for replication or removal.   */  int computeDatanodeWork() {    // Blocks should not be replicated or removed if in safe mode.    // It's OK to check safe mode here w/o holding lock, in the worst    // case extra replications will be scheduled, and these will get    // fixed up later.    if (namesystem.isInSafeMode()) {      return 0;    }    final int numlive = heartbeatManager.getLiveDatanodeCount();    final int blocksToProcess = numlive        * this.blocksReplWorkMultiplier;    final int nodesToProcess = (int) Math.ceil(numlive        * this.blocksInvalidateWorkPct);    int workFound = this.computeReplicationWork(blocksToProcess);    // Update counters    namesystem.writeLock();    try {      this.updateState();      this.scheduledReplicationBlocksCount = workFound;    } finally {      namesystem.writeUnlock();    }    workFound += this.computeInvalidateWork(nodesToProcess);    return workFound;  }






0 0
原创粉丝点击