HDFS-Hadoop文件系统
第一节:HDFS的文件结构
学习HDFS首先得了解HDFS的文件结构,以及它是如何更新和保存数据的,要了解HDFS首先得知道HDFS主要由三个部分组成:namenode,datanode,secondaryNamenode.
这三者的关系按照我的理解就是主人,下人,小秘的关系。namenode是主人的角色,他是一个管理者,是一个决策者。datanode是一个下人,准确来说是一堆下人,他们的工作就是按照主人的吩咐干好本职工作,总是前赴后继的角色。secondaryamenode就是一个小蜜,主人以一大堆下人之间以一种特定的合同文书来维持,小蜜的人物就是在一定时间或者文书积累到一定量的时候,帮主人整理这些文书,保持最简介高效。
1.1 namenode
namenode作为hdfs的头脑,他的主要工作是接受客户端请求,合理的读取和划分数据并存储;而namenode数据存放也是分为两个部分:内存,硬盘中。
内存的数据主要是一些元数据信息,元数据信息就像是一个索引信息,通过索引可以轻松的找到需求的数据的位置包括副本位置;元数据的存在主要是为了便于读取hdfs中的数据。
硬盘中的数据比较多,最新格式化的namenode会生成以下文件目录结构:${dfs.name.dir}/current/VERSION
/edits
/fsimage
/fstime
这四个文件以及文件夹。VERSION文件里面记载了一些namenode的基础信息,而其中有一个namespaceID,这是这个namenode的唯一标示,而这个表示需要所有的datanode的ID保持一致,正常运行的hdfs,namenode和datanode的id是完全相同的。
那么剩下的这三个文件:
edits是hdfs的日志文件,这里记录着namenode上的一些读写操作。这是namenode储存的第一个重要的信息,它记录了近期的所有操作记录以及操作状态和操作内容;edits十分重要,他是一个做namenode数据同步的重要文件。
fsimage是namenode的存在内存中的元数据在硬盘上的镜像文件,但镜像文件并不是与matadata(元数据)时时同步的,在达到一定条件fsimage会执行更新操作来保持和内存中的元数据信息保持一致,而执行这个镜像同步操作的凭据就是edits。
fstime,镜像生成或者修改时间,不许多讲。
namenode主要涉及到的就是读和写操作,其中都比较简单(相对),写则会有一个过程
namenode的写操作,首先客户端先申请写操作,namenode会去找适合存放数据和数据副本的内存位置,然后将这条具体的数据存放的信息写入日志文件,然后将具体的信息交给客户端,客户端将数据交给datanode按照namenode的规则来存放数据,当写入成功,但成功代码尚未返回给客户端之前刷新和同步日志文件,其实就是加了一个状态位。然后namenode在客户端返回成功后生成metadata(元数据)以及生成一个fsimage。
而在那门哦的工作中,secondaryname作为一个附庸,其实它也一直在为工作,他的工作就是解决matadata和fsimage之间的不和谐(不一致),这里为神马会使用到secondarynamenode来帮助namenode来管理namenode,原因是因为namenode不断的写,会产生大量的日志,若namenode重起,那么加载这些日志文件就会消耗大量的时间,而采用secondarynamenode处理过edits和faimage后,edits的大小始终保持一个比较小的水平,那么naemnode就算重启也可以快速启动而且保持前面的状态。
关于secondarynamenode如何更新fsimage以及edits
(1)SENode首先通过HTTP获取namenode中的fsimage和edits。
(2)SENode读取fsimage到内存中,然后执行edits中的所有操作,并创建一个新的fsimage文件。
(3)SENode通过HTTP方式将新的fsimage发送到namenode中
(4)namenode中新的fsimage会替代旧的fsimage然后edits文件清空并且更新fstime。
1.2 secondary NameNode
secondaryNamenode的文件目录与那门哦的完全一样,只是它的配置文件的根目录可能会不同,根据hdfs-.xml中的配置来决定。
secondarynamenode在帮namenode时也会在自己的本地保存最新的namenode的edits后人fsimage文件,他的作用就是帮助namenode以及当namenode挂掉的时候,帮助恢复namenode配置。
(1)直接将全部本地文件(secondarynamenode中的数据:edits,fsimage,fstime)全部复制到新的namenode。
(2)将secongarynamenode作为新的namenode来使用。