大数据培训新三板挂牌机构 股票代码:837906 | EN CN
异常解决方案—NameNode 宕机读写测试
异常解决方案—NameNode 宕机切换实验
异常解决方案—Data Node 配置
异常解决方案—Backup Node配置
异常解决方案—NameNode配置
异常解决方案—6.5.1异常情况分析
安装及配置
5NameNode安装及配置以及6BackupNode安装及配置
6.4.4虚拟机集群架设
6.4.3安装JDK
3.配置操作系统
2.创建虚拟机与安装操作系统
6.4构建实验环境
实验方案说明
故障切换机制
日志池(journal spool)机制
元数据操作情景分——BackupNode更新磁盘上的日志文件
元数据操作情景分——NameNode通过日志输出流......
元数据操作情景分——NameNode将日志写入日志文件
元数据操作情景分——NameNode更新内存镜像
元数据操作情景分——客户端执行命令流程
元数据操作情景分
Hadoop的Backup Node方案——运行机制分析(5)
Hadoop的Backup Node方案——运行机制分析(4)
Hadoop的Backup Node方案——运行机制分析(3)
Hadoop的Backup Node方案——运行机制分析(2)
Hadoop的Backup Node方案——运行机制分析(1)
Hadoop的Backup Node方案——系统架构
Hadoop的Backup Node方案—Backup Node 概述
元数据可靠性机制以及使用说明
Checkpoint 过程情景分析
元数据更新及日志写入情景分析
NameNode启动加载元数据情景分析
Hadoop的元数据备份机制的进行分析
元数据应用场景分析
Format情景分析
磁盘元数据文件
HDFS之代码分析——元数据结构
HDFS之内存元数据结构
什么是HDFS的元数据
Hadoop中DRDB方案和AvatarNode方案
Hadoop中常用各方案的对比
Hadoop的BackupNode方案
Hadoop的CheckpointNode方案
Hadoop的SecondaryNameNode方案
Hadoop的元数据备份方案
影响HDFS可用性的几个因素
什么是高可用性? 详细解析
HDFS系统架构简介
如何安装和配置Hadoop集群
如何在Windows下安装Hadoop
在MacOSX上安装与配置Hadoop
Linux下安装Hadoop的步骤
Hadoop的集群安全策略介绍
Hive的数据管理介绍
HBase的数据管理介绍
HDFS的数据管理介绍
Hadoop计算模型之 MapReduce 简介
Hadoop于分布式开发
Hadoop体系结构介绍
Hadoop的项目结构详解
一文读懂Hadoop

Hadoop的Backup Node方案——运行机制分析(3)

于2018-01-17由小牛君创建

分享到:


3. Initialize

Handshake验证成功后,BackupNode会调用父类的initialize方法。initialize中的关键方法是loadNamesystemBackupNode重写(override)了loadNamesystem方法,因此,实际调用的是BackupNodeloadNamesystem方法。在NameNodeloadNamesystem方法中,NameNode会从磁盘加载元数据到内存,而BackupNodeloadNamesystem并不加载元数据到内存。具体分析代码如下:

handshake执行完后,接下来调用父类NameNode中的initialize方法。

NameNode.java

protected void initialize(Configuration conf) throws IOException {

……

loadNamesystem(conf);

……

}

BackupNode重写(override)了父类NameNodeloadNamesystem方法,不同之处在于FSNamesystem的构造函数。

BackupNode.java

protected void loadNamesystem(Configuration conf) throws IOException {

BackupStorage bnImage = new BackupStorage();

// Backup node 构造 FSNamesystem 的方法和 NameNode 中的方法不一样

this.namesystem = new FSNamesystem(conf, bnImage);

bnImage.recoverCreateRead(FSNamesystem.getNamespaceDirs(conf),

FSNamesystem.getNamespaceEditsDirs(conf));

}

NameNode.java

protected void loadNamesystem(Configuration conf) throws IOException {

this.namesystem = new FSNamesystem(conf);

}

FSNamesystem类中维护了几个重要的表:

l  维护了文件名与block列表的映射关系;

l  有效block的集合;

l  block与节点列表的映射关系;

l  节点与block列表的映射关系;

l  更新的heartbeat节点的LRUcache

FSNamesystem.java

FSNamesystem(Configuration conf, BackupStorage bnImage) throws

IOException {

try {

//Backup Node 中调用的 initialize 参数非空

initialize(conf, bnImage);

} catch(IOException e) {

……

}

}

FSNamesystem(Configuration conf) throws IOException {

try {

//NameNode 中调用的 initialize 参数为空

initialize(conf, null);

} catch(IOException e) {

……

}

}

private void initialize(Configuration conf, FSImage fsImage)

throws IOException {

……

if(fsImage == null) {

// NameNode 的执行路径 FSDirectory 负责存储文件系统的目录状态,

//也就是维护文件系统的名字空间

this.dir = new FSDirectory(this, conf);

StartupOption startOpt = NameNode.getStartupOption(conf);

// 加载元数据文件并合并,形成内存镜像

this.dir.loadFSImage(getNamespaceDirs(conf),

getNamespaceEditsDirs(conf), startOpt);

……

} else {

// Backup Node 的执行路径

// 此时 Backup Node 并不加载元数据文件,因此也未形成元数据内存镜像

this.dir = new FSDirectory(fsImage, this, conf);

}

……

}

NameNode调用loadFSImage,设置ready标志;而BackupNode不调用loadFSImage,因此ready为初始值falseready标志非常重要,许多客户端对文件的操作,都需要检查ready值,只有在ready=true,才允许操作继续,因此,BackupNodeready=true之前,都无法响应客户端的操作。

FSDirectory.java

void loadFSImage(Collection<URI> dataDirs, Collection<URI> editsDirs,

StartupOption startOpt) throws IOException {

……

try {

// 选择最新的 FSImage Edits 加载到内存,合并形成内存镜像

if (fsImage.recoverTransitionRead(dataDirs, editsDirs, startOpt)) {

fsImage.saveNamespace(true);

}

……

} catch(IOException e) {

……

}

synchronized (this) {

// 设置 ready 标志

this.ready = true;

this.notifyAll();

}

}