名字节点(NameNode)目录结构

来源:互联网 发布:八大菜系之首 知乎 编辑:程序博客网 时间:2024/05/21 10:13

本文章主要介绍名字节点元数据的存储目录结构,以及每个文件的基本内容。

一 目录结构图

NameNode 的元数据存储目录结构:
这里写图片描述

二 文件基本介绍

current目录为当前集群正在使用的目录,previous目录是版本升级之前的目录。版本进行回滚的时候,previous目录就会发挥作用。
我们首先了解一下transactionId的概念。当客户端没发起一次RPC请求对NameNode的名字空间进行修改后,NameNode会用一个唯一的transactionId标识。
①VERSION : 版本号、集群号、创建时间、类型等。
②edits_start ID-end ID : edits文件中存放的是客户端执行的所有更新命名空间的操作。每个edits文件都包含了文件名中start transaction id - end transaction id之间的所有事务。
③edits_inprogress__start transaction ID : 正在被追加的日志。所有从transaction id开始的新的修改操作都会被记录在此文件中,直到HDFS重置(roll)这个日志文件。
④fsimage_end transaction ID : Hadoop文件系统元数据的一个永久的检查点,包含了end transaction id之前的完整的HDFS名字空间元数据镜像。
⑤seen_txid : 保存最近一次fsimage或者edits_inprogress的transaction Id,这个Id并不是最新的事务Id。
⑥in_use.lock : 文件锁,防止一台机器同时启动多个Namenode进程导致目录数据不一致。

三 VERSION 文件详解

#Thu Dec 15 10:07:46 CST 2016namespaceID=1277563549clusterID=CID-a4ff16ba-4427-4f8a-bbaf-4665b3ce714bcTime=0storageType=NAME_NODEblockpoolID=BP-1697576408-127.0.0.1-1481767666542layoutVersion=-63
  • layoutVersion - HDFS metadata版本号,通常只有HDFS增加新特性时才会更新这个版本号。
  • namespaceID/clusterID/blockpoolID - 这三个ID在整个HDFS集群全局唯一,作用是引导Datanode加入同一个集群。在HDFS Federation机制下,会有多个Namenode,所以不同Namenode的namespaceID是不同的,分别管理一组blockpoolID,但是整个集群中,clusterID是唯一的,每次format namenode会生成一个新的,也可以使用-clusterid手工指定ID。
  • storageType - 有两种取值NAME_NODE /JOURNAL_NODE,对于JournalNode的参数dfs.journalnode.edits.dir,其下的VERSION文件显示的是JOURNAL_NODE。

四 Fsimage和Edits文件详解

Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件idnode的序列化信息。
Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。
fsimage和edits文件都是经过序列化的,在NameNode启动的时候,会将fsimage文件中的内容加载到内存中,之后执行edits文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作。
对于文件来说,包含的信息有修改时间、访问时间、块大小和组成一个文件块信息等。而对于目录来说,包含的信息主要有修改时间、访问控制权限等信息。fsimage并不包含DataNode的信息。

五 配置相关

NameNode元数据存储路径设置hdfs-site.xml:

<property>    <name>dfs.namenode.name.dir</name>    <value>file:/home/hadoop/dfs/name</value>    <final>true</final></property>

JournalNode(在高可用性模式下会出现)元数据存储路径设置core-site.xml :

<property>  <name>dfs.journalnode.edits.dir</name>  <value>/path/to/journal/node/local/data</value></property>
1 0