边城

软件就是驱动世界,改造世界

欢迎来到边城客栈


Hadoop源码分析-01-Startup Progress

前言

   在HDFS启动的过程中,我们可以在webUI观察到,Startup Progress.笔者以最新的源代码对这一部分源码做一个简要的分析,加深对HDFS启动
加载的过程做一个更加深入的理解.

启动过程剖析

启动阶段(Phase)

  1. LOADING_FSIMAGE
  2. LOADING_EDITS
  3. SAVING_CHECKPOINT
  4. SAFEMODE


public enum Phase {
  LOADING_FSIMAGE("LoadingFsImage", "Loading fsimage"),
  LOADING_EDITS("LoadingEdits", "Loading edits"),
  SAVING_CHECKPOINT("SavingCheckpoint", "Saving checkpoint"),
  SAFEMODE("SafeMode", "Safe mode");
}

如上所述: 启动阶段分为把fsimage文件加载到内存,把edits加载到内存并且把edits文件中对应的操作放入内存中 保存新的检查点,最后namenode进入安全模式节点,直到等待DataNode把数据汇报完毕,退出安全模式.

每个阶段的状态(Status)

  1. PENDING
  2. RUNNING
  3. COMPLETE


public enum Status {
  PENDING,
  RUNNING,
  COMPLETE
}

每个阶段分为等待中,运行中,已经完成

每个阶段的下一步(StepType)

  1. AWAITING_REPORTED_BLOCKS
  2. DELEGATION_KEYS
  3. DELEGATION_TOKENS
  4. INODES
  5. CACHE_POOLS
  6. CACHE_ENTRIES
  7. ERASURE_CODING_POLICIES


public enum StepType {

  AWAITING_REPORTED_BLOCKS("AwaitingReportedBlocks", "awaiting reported blocks"),
  DELEGATION_KEYS("DelegationKeys", "delegation keys"),
  DELEGATION_TOKENS("DelegationTokens", "delegation tokens"),
  INODES("Inodes", "inodes"),
  CACHE_POOLS("CachePools", "cache pools"),
  CACHE_ENTRIES("CacheEntries", "cache entries"),
  ERASURE_CODING_POLICIES("ErasureCodingPolicies", "erasure coding policies");
}


每个阶段有下一步不同的类型,等待块汇报 INODES加载 NameNode和键和令牌的操作,加载缓冲池,缓存实体纠删码加载

PhaseTracking&StepTracking 阶段和下一步跟踪

final class PhaseTracking extends AbstractTracking{}
final class StepTracking extends AbstractTracking{}

PhaseTracking,StepTracking全部继承自AbstractTracking用来统计每一步执行的时间.

@InterfaceAudience.Private
final class PhaseTracking extends AbstractTracking {
  String file;
  long size = Long.MIN_VALUE;
  final ConcurrentMap<Step, StepTracking> steps =
    new ConcurrentHashMap<Step, StepTracking>();
}

ConcurrentMap<Step, StepTracking>可以看出每一个Phase包含多个Step

StartupProgress 启动程序类

  final Map<Phase, PhaseTracking> phases =
    new ConcurrentHashMap<Phase, PhaseTracking>();

如上代码片段说明每一个StartupProgress包含多个Phase.

  private StepTracking lazyInitStep(Phase phase, Step step) {
    ConcurrentMap<Step, StepTracking> steps = phases.get(phase).steps;
    if (!steps.containsKey(step)) {
      steps.putIfAbsent(step, new StepTracking());
    }
    return steps.get(step);
  }

如上代码片段,在一个phases的Map中存放了多个Step的Map值,到这里我们基本上就可以梳理出来 HDFS启动过程的结构了.

启动系统结构梳理图

启动过程代码结构如下

启动程序开始后,先执行每一个Phase,每一个Phase中包含多个Step.

总结

以上为笔者启动阶段源代码结构.启动还涉及到各个阶段的时间统计等等,笔者在此没有过多的阐述,希望读者可以通过阅读源码加以连接.
希望本文对读者起到帮助作用.

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦