整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

10.1 HDFS 永久性数据结构

对于管理员来说,深入了解namenode、辅助namenodedatanodeHDFS组件如何在磁盘上组织永久性数据非常重要。洞悉各文件的用法有助 于进行故障诊断和故障检出。

1. namenode的目录结构

namenode被格式化之后,将产生如下所示的目录结构:

${dfs.name.dir}/

1—- current/

|—- VERSION

|—- edits               

|—- fsimage

|—- fstime

如第9章所示,dfsnamedir属性描述了一组目录,各个目录存储着镜像 内容。该机制使系统具备了一定的复原能力,特别是当其中一个目录是 NFS的一个挂载时(推荐配置)。

厂£7?57(9#文件是一个Java属性文件,其中包含正在运行的HDFS的版本信 息。该文件一般包含以下内容:

#Tue Mar 10 19:21:36 GMT 2009 namespaceID=l34368441
storageType=NAME_NODE
layoutVersion=-18

属性layoutVersion是一个负整数,描述HDFS持久性数据结构(也称布

局)的版本,但是该版本号与Hadoop发布包的版本号无关。只要布局变 更,版本号便会递减(例如,版本号-18之后是-19),此时,HDFS也需要升 级。否则,磁盘仍然使用旧版本的布局,新版本的namenode(或datanode) 就无法正常工作。如何升级HDFS,请参见10.3.3节。

属性namespacelD是文件系统的唯一标识符,是在文件系统首次格式化时 设置的。任何datanode在注册到namenode之前都不知道namespacelD 值,因此namenode可以使用该属性鉴别新建的datanode

cTime属性标记了 namenode存储系统的创建时间。对于刚刚格式化的存储 系统,这个属性值为〇;但是在文件系统升级之后,该值会更新到新的时 间戳。

storageType属性说明该存储目录包含的是namenode的数据结构。

namenode的存储目录中还包含和W/we等二进制文件。这些 文件都使用HadoopWritable对象作为其序列化格式(参见4.3节对序列 化的讨论)。只有深入学习namenode的工作机理,才能够理解这些文件的

用途。

1.  文件系统映像和编辑日志

文件系统客户端执行写操作时(例如创建或移动文件),这些操作首先被记录 到编辑日志中。namenode在内存中维护文件系统的元数据;当编辑日志被 修改时,相关元数据信息也同步更新。内存中的元数据可支持客户端的读

请求。

在每次执行写操作之后,且在向客户端发送成功代码之前,编辑日志都需 要更新和同步。当namenode向多个目录写数据时,只有在所有写操作均执 行完毕之后方可返回成功代码,以确保任何操作都不会因为机器故障而

丢失。 /Wwage文件是文件系统元数据的一个永久性检查点。并非每一个写操作都 会更新该文件,因为/hwage是一个大型文件(甚至可髙达几个GB),如果 频繁地执行写操作,会使系统运行极为缓慢。但这个特性根本不会降低系


统的恢复能力,因为如果namenode发生故障,可以先把/s/wage文件载入 到内存重构新近的元数据,再执行编辑日志中记录的各项操作。事实上, namenode在启动阶段正是这样做的(参见10.1.2节对安全模式的讨论)。

/mage文件包含文件系统中的所有目录和文件inode的序列化信 息。每个inode是一个文件或目录的元数据的内部描述方式。对于文 件来说,包含的信息有“复本级别”(replication level)、修改时间和 访问时间、访问许可、块大小、组成一个文件的块等> 对于目录来 说,包含的信息有修改时间、访问许可和配额元数据等信息。

数据块存储在datanode中,但./i/mage文件并不描述datanode。取而 代之的是,namenode将这种块映射关系放在内存中。当datanode加 入集群时,namenodedatanode索取块列表以建立块映射关系, namenode还将定期征询datanode以确保它拥有最新的块映射。

如前所述,文件会无限增长。尽管这种情况对于namenode的运行没有 影响,但由于需要恢复(非常长的)编辑日志中的各项操作,namenode的重 启操作会比较慢。在这段时间内,将文件系统处于离线状态,会有违用户 的期望。

解决方案是运行辅助namenode,‘为主namenode内存中的文件系统元数据 创建检査点。®创建检査点的步骤如下所示(参见图10-1)。

(1) 辅助namenode请求主namenode停止使用erf/h文件,暂时将新的 写操作记录到一个新文件中。

(2) 助namenode从丰namenode获取yj/wag'e和et/to文件(采用 HTTP GET)。

(3) 辅助namenode将文件载入内存,逐一执行edto文件中的 操作,创建新的/hwcrge文件。

               (4) 辅助namenode将新的/s/wage文件发送回主namenode(使用HTTP POST)。

(5) 主namenode用从辅助namenode接收的/Wwage文件替换旧的 /j/wage文件,用步骤丨所产生的文件替换旧的文件。同 时,还更新文件来记录检査点执行的时间。

最终,主namenode拥有最新的yi/wage文件和一个更小的eof/As文件(et/z'As 文件可能非空,因为在这个过程中主namenode还可能收到一些写请求)。 当namenode处在安全模式时,管理员也可调用hadoop dfsadminsaveNamespace命令来创建检査点。

图片.png

图10-1.创建检查点的过程

该过程清晰地解释了辅助namenode和主namenode拥有相近内存需求的原 因(因为辅助namenode也把/h'wage文件载入内存)。因此,在大型集群 中,辅助namenode需要运行在一台专用机器上。

创建检査点的触发条件受两个配置参数控制。通常情况下,辅助namenode 每隔一小时(由fs.checkpoint.period属性设置,以秒为单位)创建检查点;此外,当编辑日志的大小达到64 1^8(由子5乂|16〔1^0^1:.5126属性设 置,以字节为单位)时,即使未到一小时也会创建检査点。系统每隔五分钟 检查一次编辑日志的大小。

创建检査点的过程不仅为主namenode创建检査点数据,还使辅助 namenode最终也有一份检查点数据(存储在子目录中)。 这份数据可用作namenode元数据的(尽管并非最新)备份:

图片.png

辅助 namenode 的 prev 目录、辅助 namenode 的 目录

和主namenode的cwrre⑴貝录的布局相同。这种设计方案的好处是,在主 namenode发生故障时(假设没有及时备份,甚至在NFS上也没有),可以从 辅助namenode恢复数据。有两种实现方法。方法一是将相关存储目录复 制到新的namenode中;方法二是使用-importCheckpoint选项启动 namenode守护进程,从而将辅助namenode用作新的主namenode。借助该 选项,当dfs.name.dir属性定义的目录中没有元数据时,辅助namenode 就从fs.checkpoint.dir目录载入最新的检查点数据,否则执行失败。因 此,无需担心该操作会覆盖现f的元数据。

4. datanode的目录结构

和namenode不同的是,datanode的存储目录是初始阶段自动创建的,不需 要额外格式化。datanode的关键文件和目录如下所示:

${dfs.data.dir}/current/VERSION
                 /blk_<id_l>
                /blk_<id_l>.meta 
                /blk_<id_2>
                /blk_<id_2>.meta
                 /•••
                 /blk_<id_64>
                /blk_<id_64>•meta /subdirO/
                /subdirl/
                 /…
                /subdir63/

datanode的VERSION文件与namenode的VERSION文件非常相似,如下

所示:

#Tue Mar 10 21:32:31 GMT 2009 namespaceID=l34368441
storageID=DS-547717739-172.16.85.1-50010-1236720751627 cTime=0
storageType=DATA_NODE
layoutVersion=-18

namespacelD 属性、cTime 属性和 layoutVersion 属性的值与 namenode 中的值相同。实际上,namespacelD是datanode首次访问namenode的时 候从namenode处获取的storagelD对每个datanode来说是唯一的(但对 于单个datanode中所有存储目录来说则是相同的),namenode可用这个属性 来区分不同datanode。storageType表明该目录是datanode的存储目录。

datanode的目录中的其他文件都有WA:_前缀,包括两种文件类型: HDFS块文件(仅包含原始数据)和块的元数据文件(含后缀)。块文件包 含所存储文件中一部分的原始数据;元数据文件包括头部(含版本和类型信 息)和该块各区段的一系列的校验和。

当目录中数据块的数量增加到一定规模时,datanode会创建一个子目录来 存放新的数据块及其元数据信息。如果当前目录已经存储了 64个(通过 dfs.datanode.numblocks属性设置)数据块时,就创建一个子目录。终极 目标是设计一棵高扇出的目录树,即使文件系统中的块数量非常多,目录 树的层数也不多。通过这种方式,datanode可以有效管理各个目录中的文 件,避免大多数操作系统遇到的管理难题,即很多(成千上万个)文件都放在 同一个目录之中。

如果dfs.data.dir属性指定了不同磁盘上的多个目录,那么数据块会以 轮转(round-robin)的方式写到各个目录中。注意,同一个datanode上的每 个磁盘上的块不会重复,不同datanode之间的块才可能重复。

转载请注明:全栈大数据 » 10.1 HDFS 永久性数据结构

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址