购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2
NameNode的工作

在伪分布式的环境中,NameNode只有一个。但在分布式的环境中,NameNode被抽象为NameService。而每一个NameService下最多只能有两个NameNode(Hadoop 3以后可以有多个)。这种情况下,一个NameNode为Active(活动),另一个为Standby(备份)。NameNode主要用于保存元数据、接收客户端的请求。NameNode的具体工作为:

(1)保存metadate元数据,始终在内存中保存metadata元数据信息用于处理读请求。由于每一个文件块都会保存一个元数据信息,每个文件的NameNode元数据信息大概是250Byte,4000万个小文件的元数据信息就需要4000万*250Byte≈10GB,也就是说NameNode需要10GB内存来存储和管理这些小文件的信息。如果存储一个128MB的文件,则只需要一个元数据信息,此时NameNode的内存,只占250Byte。如果存储128个小文件,每一个文件为1MB,则此时会有128个元数据信息,虽然存储量相同,但NameNode管理这些文件块所用的内存并不相同,后者将使用128×250Byte的内存大小来保存这些小文件。所以HDFS文件系统擅长处理大文件的场景,不擅长处理小文件。

(2)维护fsimage文件,也就是metadate元数据信息的镜像文件。此文件保存在$hadoop.tmp.dir所配置的目录(name目录)下。以下是fsimage文件所存在目录及目录下的文件。

 
    [hadoop@server201 current]$ pwd
    /app/datas/hadoop/dfs/name/current
    [hadoop@server201 current]$ ll
    总用量 3116
    -rw-rw-r-- 1 hadoop hadoop      42 3月  9 22:40 edits_0000000000000000001-000
0000000000000002
    -rw-rw-r-- 1 hadoop hadoop 1048576 3月  11 22:06 edits_inprogress_00000000000
00000027
    -rw-rw-r-- 1 hadoop hadoop     630 3月  11 22:06 fsimage_0000000000000000026
    -rw-rw-r-- 1 hadoop hadoop      62 3月  11 22:06 fsimage_0000000000000000026.m
d5
    -rw-rw-r-- 1 hadoop hadoop       3 3月  11 22:06 seen_txid
    -rw-rw-r-- 1 hadoop hadoop     218 3月  11 20:06 VERSION

(3)当执行写操作时,首先写editlog即向edits写日志。成功返回以后再写入内存。

(4)SecondaryNameNode同时维护fsimage和edits文件以更新NameNode的metadata元数据。

图3-2展示了NameNode是如何把元数据保存到磁盘上的。这里有两个不同的文件:

图3-2

● fsimage文件:它是在NameNode启动时对整个文件系统的快照,是metadata的镜像。

● edit logs文件:每当写操作发生时,NameNode会首先修改这个文件,然后再去修改metadata。

元数据信息包含:

● fsimage:为元数据的镜像文件,用于保存一段时间NameNode中元数据的信息。

● edits:保存了数据的操作日志。

● fstime:保存最近一次checkpoint的时间。fstime保存在内存中。

这些文件都保存在dfs.namenode.edits.dir配置的目录下,如果没有配置此项,则默认保存到file://${hadoop.tmp.dir}/dfs/name目录下,正如上面的伪分布式中我们配置的hadoop.tmp.dir=/app/datas/hadoop,则这些文件都保存到/app/datas/hadoop/dfs/name/current目录下。

NameNode始终在内存中保存metadate元数据信息。在处理读写数据操作时,会先写edits到磁盘,成功返回以后再修改内存中的metadata。

NameNode会维护一个fsimage文件,此文件是metadata保存在磁盘上的镜像文件(Hadoop2/3中fsimage与metadata操持实时同步。Hadoop1不是实时同步)。每隔一段时间SecondaryNameNode会合并fsimage和edits来更新内存中的matedata。

1.查看镜像文件

查看fsimage文件内容可以使用hdfs oiv命令,此命令用于将fsimage文件转成可读的XML文件。oiv的具体含义,可以通过help命令获取:

 
    [hadoop@server201 current]$ hdfs oiv -h
    Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE
    Offline Image Viewer
    View a Hadoop fsimage INPUTFILE using the specified PROCESSOR,
    saving the results in OUTPUTFILE.

通过上述的命令可以看到oiv的含义为Offline Image View,即查看离线文件。oiv常用参数为:

 
    Required command line arguments:
    -i,--inputFile <arg>   FSImage or XML file to process.
    
    Optional command line arguments:
    -o,--outputFile <arg>  Name of output file. If the specified
                           file exists, it will be overwritten.
                           (output to stdout by default)
                           If the input file was an XML file, we
                           will also create an <outputFile>.md5 file.
    -p,--processor <arg>   Select which type of processor to apply
                           against image file. (XML|FileDistribution|
                           ReverseXML|Web|Delimited)
                           The default is Web.

参数说明:

● -i,--inputFile:用于指定FsImage或XML文件名称。

● -o,--outputFile:输出文件名称,如果文件已经存在则会覆盖,同时会生成一个*.md5比对文件。

● -p,--processor:处理方式,默认为Web,建议使用XML。

现在我们使用oiv命令查看一个已经存在的fsimage文件,其命令如下:

 
   [hadoop@current]$ hdfs oiv -i fsimage_0000000000000000024 -o ~/fsimage.xml -p
XML

上面的命令用于将fsimage文件转成XML文件,转换成功后,就可以使用vim查看fsimage文件的内容了。打开此文件,并格式化,其内容如下(根据不同的环境内容会有不同,仅作参考):

 
    <?xml version="1.0" encoding="utf-8"?>
    <fsimage>
        <version>
            <layoutVersion>-65</layoutVersion>
            <onDiskVersion>1</onDiskVersion>
            <oivRevision>7a3bc90b05f257c8ace2f76d74264906f0f7a932</oivRevision>
        </version>
        ...
    </fsimage>

可见在fsimage文件中保存了版本、文件、节点等信息。

2.查看日志文件

hdfs oev命令用于查看edis日志文件,同样地,可以通过help命令,查看它的具体使用方法:

 
    [hadoop@server201 current]$ hdfs oev -h
    Usage: bin/hdfs oev [OPTIONS] -i INPUT_FILE -o OUTPUT_FILE
    Offline edits viewer
    Parse a Hadoop edits log file INPUT_FILE and save results
    in OUTPUT_FILE.

可见oev的含义为Offline Edits View,即查看离线edits文件。现在我们使用此命令将edits文件转成可读的XML文件:

 
   $ hdfs oev -i edits_0000000000000000013-0000000000000000014 -o ~/edits.xml -p
XML

查看得到的XML文件内容如下,可见此文件中只记录了操作的事务日志信息。

 
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <EDITS>
        <EDITS_VERSION>-65</EDITS_VERSION>
        <RECORD>
            <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
            <DATA>
                <TXID>13</TXID>
            </DATA>
        </RECORD>
        <RECORD>
            <OPCODE>OP_END_LOG_SEGMENT</OPCODE>
            <DATA>
                <TXID>14</TXID>
            </DATA>
        </RECORD>
    </EDITS>
3.日志文件和镜像文件的操作过程

在edits文件中,有一个名为edits_inprogress_开头的文件,表示是正在操作的日志文件。如当前目录下,我们正有一个这样的日志文件,它的名称为:

 
    edits_inprogress_0000000000000000028

此文件将实时记录我们对HDFS文件的操作,如我们现在删除一个文件:

 
    $ hdfs dfs -rm /test/a.txt

然后通过oev命令,将edits_inprocess_开始的文件转成XML文件,并读取里面的内容。

 
    $ hdfs oev -i edits_inprogress_0000000000000000028 -o ~/inprocess.xml -p XML

我们就会在文件的最后,发现记录删除文件的操作记录:

 
    <RECORD>
        <OPCODE>OP_DELETE</OPCODE>
        <DATA>
            <TXID>30</TXID>
            <LENGTH>0</LENGTH>
            <PATH>/test/a.txt</PATH>
            <TIMESTAMP>1615559516088</TIMESTAMP>
            <RPC_CLIENTID>68c4f333-8bad-472a-8990-4551ce0e5c2c</RPC_CLIENTID>
            <RPC_CALLID>3</RPC_CALLID>
        </DATA>
    </RECORD>

其中OPCODE的值为OP_DELETE,即为删除文件。在DATA节点中则记录了文件的详细信息。可见edits文件,会实时记录文件的操作日志。

4.合并fsimage镜像文件

默认情况下,关闭打开HDFS进程,会自动合并保存fsimage文件到磁盘。不过,也可以通过以下命令,将内存中的matedata保存为新的fsimage文件,首先查看目前的日志文件,可知最新的版本为28,即edits_inprocess_xxx28这个数字,就是最新的日志版本。而fsimage即内存中的matedata保存到磁盘上镜像文件总是比值小一个版本为27,如图3-3所示。

图3-3

或通过输出seen_txid可知,如果下一次合并则版本号为32。

 
    [hadoop@server201 current]$ cat seen_txid
    32

上面说明fsimage_00000000000000000027还没有与edits_0000000000000000028合并。现在我们使用以下命令,执行合并工作。

先进入安全模式,通过dfsadmin可以将HDFS进入安全模式,进入安全模式后,将不能操作HDFS文件系统中的文件,一般在HDFS刚刚启动时,会有一段时间为安全模式,等所有的fsimage文件加载到内存后,将会自动退出安全模式。

使用dfsadmin命令让HDFS进入安全模式:

 
    [hadoop@server201 current]$ hdfs dfsadmin -safemode enter
    Safe mode is ON

也可以通过dfsadmin get查看当前是否处于安全模式下:

 
    [hadoop@server201 current]$ hdfs dfsadmin -safemode get
    Safe mode is ON

保存matedata数据到fsimage中:

 
    [hadoop@server201 current]$ hdfs dfsadmin -saveNamespace
    Save namespace successful

退出安全模式:

 
    [hadoop@server201 current]$ hdfs dfsadmin -safemode leave
    Safe mode is OFF

现在再来查看日志文件,已经发生变化,如图3-4所示。说明已经将内存中的元数据保存到新的fsimage镜像文件中。

图3-4 U+5ej8tGmX8PEXqvAazvDosl2E9MyRZRbv0LiTNq8wsZBP9liRVBYVCL240SNaAl

点击中间区域
呼出菜单
上一章
目录
下一章
×