元数据持久化

简介: 元数据持久化【2月更文挑战第25天】

在Hadoop的HDFS(Hadoop Distributed File System)中,元数据(metadata)是文件系统的核心组成部分,它包含了文件系统的目录结构、文件与块的映射关系、块的副本位置信息等。为了确保这些元数据在故障发生时不会丢失,HDFS采用了持久化存储的策略,即将元数据保存在磁盘上,并且使用日志(edit logs)和镜像文件(fsImage)来保证元数据的一致性和可恢复性。

HDFS元数据持久化

元数据的持久化方式

  1. fsImage文件:这是一个二进制文件,包含了文件系统的完整快照。当NameNode启动时,它会加载fsImage文件到内存中,从而快速恢复文件系统的状态。
    image.png

  2. Edit Logs:当文件系统的状态发生变化时(如创建文件、删除文件、重命名文件等),这些变化会被记录在Edit Logs中。Edit Logs是顺序写入的,这使得它们具有很高的写入性能。

  3. Secondary NameNode:虽然名为“Secondary NameNode”,但它并不承担NameNode的备份职责。它的主要工作是合并Edit Logs和fsImage,生成一个新的fsImage,并推送给NameNode。这个过程称为Checkpoint。Secondary NameNode的存在主要是为了减轻NameNode的负担,避免单个NameNode节点成为瓶颈。

具体代码

元数据持久化相关的代码片段:

NameNode启动时加载fsImage

在NameNode的启动过程中,会加载fsImage文件到内存中。

// 在NameNode的启动代码中
FSImage fsImage = new FSImage(conf, dir, fsImageFactory);
FSEditLog editLog = new FSEditLog(conf, dir, editLogFactory);
FSNamesystem namesystem = new FSNamesystem(conf, fsImage, editLog);
namesystem.loadFSImage();
namesystem.recover();

image.png

写入Edit Logs

当文件系统状态发生变化时,会生成对应的Edit Log记录。 写入Edit Log:

// 在FSNamesystem类中
private FSEditLog editLog;

// ...

public void logSync() throws IOException {
   
   
    editLog.logSync();
}

// 当文件系统的状态发生变化时,会调用以下方法
public void startLogSegment() throws IOException {
   
   
    editLog.startLogSegment();
}

public void logModify(FSEditLogOp op) throws IOException {
   
   
    editLog.logModify(op);
}

image.png

Secondary NameNode合并fsImage和Edit Logs

Secondary NameNode会定期合并fsImage和Edit Logs,并生成新的fsImage。 合并过程:

// 在SecondaryNameNode类中
public void doCheckpoint(long txid) throws IOException {
   
   
    // ...
    FSImage fsImage = new FSImage(fsImageFactory, dir, conf);
    FSEditLog editLog = new FSEditLog(editLogFactory, dir, conf);
    CheckpointSignature signature = new CheckpointSignature(conf);

    // Merge fsImage and Edit Logs
    long newTxid = fsImage.merge(editLog, signature, txid);

    // ...

    // Push the new fsImage to the NameNode
    NameNode.pushImageToActiveNN(new FSImage(fsImageFactory, dir, conf),
                                 dir, conf, nnAddress);
    // ...
}

在HDFS的实际实现中,这个过程要复杂得多,涉及到多线程同步、错误处理、恢复机制等多个方面。

目录
相关文章
|
5月前
|
存储 消息中间件 数据管理
AutoMQ 中的元数据管理
AutoMQ 作为新一代基于云原生理念重新设计的 Apache Kafka 发行版,其底层存储从传统的本地磁盘替换成了以对象存储为主的共享存储服务。对象存储为 带来可观成本优势的同时,其与传统本地磁盘的接口和计费方式的差异也为 AutoMQ 在实现上带来了挑战,为解决这一问题,AutoMQ 基于 KRaft 进行拓展,实现了一套针对对象存储环境的流存储元数据管理机制,在兼顾成本的同时,极大的保证了基于对象存储的读写性能。
40 3
|
缓存 监控 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(三)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(三)
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(四)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(四)
|
缓存 NoSQL 算法
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(一)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(一)
|
缓存 NoSQL Java
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(四)
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(四)
|
缓存 NoSQL 关系型数据库
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(一)
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(一)
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(二)
分布式文件存储与数据缓存 Redis高可用分布式实践(下)(二)
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(三)
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(三)
|
存储 缓存 NoSQL
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(二)
分布式文件存储与数据缓存 Redis高可用分布式实践(上)(二)
|
存储 缓存 NoSQL
HDFS 元数据持久化笔记
HDFS 元数据持久化笔记
209 0

热门文章

最新文章