首家大数据培训挂牌机构 股票代码: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

HDFS之代码分析——元数据结构

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

分享到:



先来看类FSNamesystem的三个重要成员变量。如下所示。

Package org.apache.hadoop.hdfs.server.namenode;

FSNamesystem.java

Public class FSNamesystem implements FSConstants,FSNamesystemMBean,

FSClusterStats{

……

Public FSDirectory dir;

BlockManager blockManager;

NavigableMap<String, DatanodeDescriptor> datanodeMap=

New TreeMap<String, DatanodeDescriptor>();

……

}

FSDirectory实现了INode的管理,并且通过成员变量“FSImagefsImage”实现了元数据信息的加载以及持久化存储。如下所示。

package org.apache.hadoop.hdfs.server.namenode;

FSDirectory.java

class FSDirectoryimplementsFSConstants,Closeables{

……

final INodeDirectoryWithQuota rootDir;

FSImage fsImage;

……

INodeFileUnderConstruction addFile(……){……};

boolean mkdirs(……){……};

……

}

FSImage是实现INode信息与元数据镜像文件fsimage以及日志文件edits之间相互转换的桥梁,其中与日志有关的功能由其成员变量“FSEditLogeditLog”来实现。如下所示。

package org.apache.hadoop.hdfs.server.namenode;

FSImage.java

public class FSImage extends Storage {

……

protected FSEditLog editLog = null;

……

boolean loadFSImage() throws IOException {……}

……

int loadFSEdits(StorageDirectory sd){……}

……

void saveFSImage() throws IOException {……}

……

public void format() throws IOException {……}

}

FSEdit类定义了日志操作的类型,如OP_INVALID=1OP_ADD=0OP_RENAME=1OP_DELETE=2OP_MKDIR=3等。如下所示。

packageorg.apache.hadoop.hdfs.server.namenode;

FSEditLogjava

publicclassFSEditLog{

……

private ArrayList<EditLogOutputStream> editStreams = null;

……

static int loadFSEdits(EditLogInputStream edits) throws IOException {……}

……

synchronized void logEdit(byte op, Writable ... writables) {……}

synchronized void logSyncAll() throws IOException {……}

public void logSync() throws IOException {……}

public void logOpenFile(String path, INodeFileUnderConstruction newNode)

throws IOException {……}

public void logCloseFile(String path, INodeFile newNode) {……}

public void logMkDir(String path, INode newNode) {……}

void logRename(String src, String dst, long timestamp) {……}

……

}

HDFS提供了一个分层的目录结构,最顶端是根目录“/”,文件系统中的每一个元素,如目录、文件等都称之为INode,每一个INode有一些公共属性和方法,如名字(protectedbyte[]name;),父目录(protected INodeDirectory parent;),修改时间(rotectedlongmodificationTime;),访问时间(protected volatile long accessTime;)等。

HDFS中一共有4种类型的INode,每一种类型由一种INode子类来实现,其中:

INodeDirectory表示目录类型的INode

INodeFile表示文件类型INode

INodeDirectoryWithQuota是类INodeDirectory的子类,它表示有配额限制的目录;

INodeFileUnderConstruction是类INodeFile的子类,它表示正在写入的文件,当用户创建一个文件时,HDFS首先会实例化类InodeFileUnderConstruction的一个对象来表示该文件,接下来用户向文件写入数据,写入结束后,HDFS会实例化一个INode对象来取代原来的类INodeFileUnderConstruction对象。

如下所示。

package org.apache.hadoop.hdfs.server.namenode;

INodejava

abstract class INode implements Comparable<byte[]>, FSInodeInfo {

protected byte[] name;

protected INodeDirectory parent;

……

}

package org.apache.hadoop.hdfs.server.namenode;

INodeFilejava

class INodeFile extends INode {protected byte[] name;

……

protected BlockInfo blocks[] = null;

}

BlockManager通过成员变量“finalBlocksMapblocksMap;”实现HDFS所有Block的管理。

BlocksMap通过Hash“privateMap<BlockInfo,BlockInfo> map;”来存储HDFS中所有的Block,并且提供了相应的Block操作方法。

BlockInfo是类BlocksMap的内部类,它包括“privateINode Fileinode;”“Object[]triplets;”等成员变量,其中:

“privateINodeFileinode;”表示该Block所对应的INode节点;triplets[3*i]代表的是第i个副本所在的DataNodeDataNode维护了一个它所存储的副本的列表,以该Block所在副本列表位置为基准,triplets[3*i+1]代表的是副本列表的前一个Blocktriplets[3*i+2]代表的是后一个Block

通过Hash“privateMap<BlockInfo,BlockInfo>map;”HDFS可以快速地找到当前BlockBlockInfo,然后通过BlockInfo中的triplets[3*i+1]triplets[3*i+2]HDFS可以很方便地遍历该Block所在DataNode的所有Block,通过BlockInfoinode“protected BlockInfoblocks[]=null;”可以很方便地遍历该Block对应文件的所有Block。如下所示。

package org.apache.hadoop.hdfs.server.namenode;

BlocksMap.java

public class BlockManager {

……

final BlocksMap blocksMap;

……

}

package org.apache.hadoop.hdfs.server.namenode;

BlocksMap.java

public class BlocksMap {

……

private Map<BlockInfo, BlockInfo> map;

boolean addNode(Block b, DatanodeDescriptor node, int replication) {……}

boolean removeNode(Block b, DatanodeDescriptor node) {……}

……

}

package org.apache.hadoop.hdfs.server.namenode;

BlocksInfo.java

class BlockInfo extends Block {

……

private INodeFile inode;

……

private Object[] triplets;

……

}

DatanodeDescriptor是类DatanodeInfo的子类,类DatanodeInfo的成员变量“private volatile BlockInfo blockList=null;”维护了该Data Node上所有Block的一个链表,其中:blockList是链表的头,“protected long capacity;”“protected long dfsUsed;”“protected long remaining;”“protected long lastUpdate;”“protected String hostName=null;”分别记录了Data Node节点容量、空间使用率、剩余空间、更新时间、主机名等信息。如下所示。

package org.apache.hadoop.hdfs.server.namenode;

DatanodeDescriptor.java

public class DatanodeDescriptor extends DatanodeInfo {

……

private volatile BlockInfo blockList = null;

……

boolean addBlock(BlockInfo b) {……}

……

boolean removeBlock(BlockInfo b) {……}

……

}

package org.apache.hadoop.hdfs.protocol;

DatanodeInfo.java

public class DatanodeInfo extends DatanodeID implements Node {

protected long capacity;

protected long dfsUsed;

protected long remaining;

protected long lastUpdate;

……

protected String hostName = null;

……

}