2021年山东大学软件工程应用与实践项目——Hadoop源码分析(八)

本文深入分析Hadoop HDFS的NameNode实现,聚焦于FSImage文件系统镜像,详细探讨StorageInfo类、DirIterator类以及FSImage的枚举、内部类、成员变量和方法。内容涵盖NameNodeFile、CheckpointStates、NameDirType等关键概念。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

Hadoop源码分析(八)——NameNode实现(4)

Hadoop源码分析(五)—— NameNode实现(1)
Hadoop源码分析(六)—— NameNode实现(2)
Hadoop源码分析(七)—— NameNode实现(3)

6.FSImage文件系统镜像

FSImage 所在的包为 org.apache.hadoop.hdfs.server.namenode,该类用于处理对于 namenode 的命名空间的更新操作,它会将更新操作记录到日志文件中,而且会定期生成对应的检查点。FSImage继承自 Storage,而Storage进一步继承自StorageInfo,所以我们首先来分析Storagelnfo类。Storagelnfo所在的包为org.apache.hadoop.hdfs.server.common,该类是存储信息的通用实体类。

6.1 StorageInfo类

public int layoutversion;
//从存储的文件中读取的版本信息。
public int namespacelD;
//存储介质对应的命名空间ID。它是根据address + port来进行散列得到的。
public long cTime;
//文件或者目录的创建时间。
public Storageinfo () {
   
this(0, 0, 0L);
}
//默认的构造方法,将成员变量都初始化为0。
public Storageinfo(int layoutV, int nsID, long cT) {
   
layoutversion = layoutV;
namespacelD = nsID;
cTime = cT;
}
//根据指定的参数值来初始化成员变量。
public Storageinfo(Storageinfo from) {
   
setstorageinfo(from);
}
//根据另一个Storageinfo对象的信息来初始化此Storageinfo的成员变量。

根据另一个Storageinfo对象的信息来初始化此Storageinfo的成员变量。
Storage 所在的包为 org.apache.hadoop.hdfk.server.common,它继承自上面的 Storagelnfb 类。 本地存储信息会被保存到一个单独的VERSION文件中,它的内容如下:

namespaceID=281506863
//文件系统命名空间的ID
cTime=0
//文件系统状态的创建时间。
storageType=NAME_NODE
//存储的类型。
layoutVersion=-l8
//版本号信息。

本地存储可以被保存到多个储存目录中,每个目录中应该保存相同的VERSION文件。当hadoop的 namenode或者datanode启动的时候,会从VERSION文件中读取本地的存储信息,此时会对每个存储目 录加上一把锁,从而保证其他的结点不会因为共享同一个存储目录而启动。当hadoop的namenode或者 datanode终止的时候,会释放掉它们所持有的存储目录的锁,从而使其他的结点来使用该存储目录。
接下来看一下Storage中定义存储状态的StorageState枚举类型:

NON_EXISTENT,
//指定的目录不存在。
NOT_FORMATTED,
//指定的目录存在但是未被格式化。
COMPLETE_UPGRADE,
//完成升级,此时previous.tmp和current目录同时存在。
RECOVER_UPGRADE,
//恢复升级,此时previous.tmp目录存在,但是current目录不存在。
COMPLETE*1 INAL I ZE,
//完成确认,此时finalized.tmp和current目录都存在。
COMPLETE_ROLLBACK,
//完成回滚,此时removed.tmp和current目录存在,但是previous目录不存在。
RECOVER_ROLLBACK,
//恢复回滚,此时removed.tmp和previous目录存在,但是current目录不存在。
COMPLETE_CHECKPOINT,
完成检查点,此时lastcheckpoint.tmp和current目录都存在。
RECOVER_CHECKPOINT,
//恢复检查点,此时lastcheckpoint.tmp目录存在,但是current目录不存在。
NORMAL;
//正常。

接下来看一下Storage中用于定义与存储相关的文件或者目录的成员变量:

private static final String STORAGE_FILE_LOCK = "in_use.lock";
//用于保存存储目录的锁的文件。
protected static final String STORAGE_FILE_VERSION = "VERSION"//用于保存存储目录的版本信息的文件。
public static final String STORAGE_DIR_CURRENT = "current";
//当前的存储目录。
private static final String STORAGE_DIR_PREVIOUS = "previous";
//用于升级之后保存以前版本的目录。
private static final String STORAGE_TMP_REMOVED = "removed, tmp";
//用于回滚过程中保存文件的目录。如果回滚成功,removed.tmp目录会被删除;否则,removed.tmp 目录会在系统启动而执行恢复的过程中重命名为currento
private static final String STORAGE_TMP_PREVIOUS = "previous.tmpn";
//用于升级过程中保存以前版本的目录。当升级成功之后,previous.tmp将被重命名为previous;否贝U, previous.tmp将会被重命名为current。
private static final String STORAGE_TMP_FINALIZED = "finalized. tmp";
//用于提交过程中保存文件的目录。该目录下保存了升级前的文件系统的状态信息。
private static final String STORAGE_TMP_LAST_CKPT = "lastcheckpoint.trnp";
//用于保存最新的检查点信息的临时目录。当有新的文件系统状态被保存到current目录中时, lastcheckpoint.tmp会保存当前文件系统的状态。如果最新的文件系统状态保存成功,贝0 lastcheckpoint.tmp 会被重命名为 previous.checkpoint;否则 lastcheckpoint.tmp 会被重命名为 currento
private static final String STORAGE_PREVIOUS_CKPT = "previous.checkpoint";
//用于保存最后一次对文件系统的状态进行更新之前的文件系统的状态信息的目录。

接下来看一下Storage中的与存储相关的3个内部类:
StorageDirType接口中定义了与存储目录相关的方法,源代码如下:

public StorageDirType getStorageDirType();
//该方法用于获得存储目录的类型。
public boolean isOfType(StorageDirType type);
//该方法用于检查某个目录是否为指定的存储目录。

StorageDirectory类是代表一个存储目录的实体类,它的源代码如下:

File root;
//存储目录的根目录。
FileLock lock;
//存储目录的锁对象。
StorageDirType dirType;
//存储目录的类型。
public File getVersionFile() {
   
return new File(new File(root, STORAGE_DIR_CURRENT), STORAGE_FILE_VERSION);
}

该方法用于返回VERSION文件的路径,VERSION会保存在current目录下。

public void read() throws lOException {
   
read(getVersionFile());
}
public void read(File from) throws IOException {
   
RandomAccessFile file = new RandomAccessFile (from, "rws");
FileInputStream in = null;
try {
   
in = new FilelnputStream(file.getFD());
file.seek(O);
Properties props = new Properties(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值