前言
在HDFS启动的过程中,我们可以在webUI观察到,Startup Progress.笔者以最新的源代码对这一部分源码做一个简要的分析,加深对HDFS启动
加载的过程做一个更加深入的理解.
启动过程剖析
启动阶段(Phase)
- LOADING_FSIMAGE
- LOADING_EDITS
- SAVING_CHECKPOINT
- 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)
- PENDING
- RUNNING
- COMPLETE
public enum Status {
PENDING,
RUNNING,
COMPLETE
}
每个阶段分为等待中
,运行中
,已经完成
每个阶段的下一步(StepType)
- AWAITING_REPORTED_BLOCKS
- DELEGATION_KEYS
- DELEGATION_TOKENS
- INODES
- CACHE_POOLS
- CACHE_ENTRIES
- 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
.
总结
以上为笔者启动阶段源代码结构.启动还涉及到各个阶段的时间统计等等,笔者在此没有过多的阐述,希望读者可以通过阅读源码加以连接.
希望本文对读者起到帮助作用.