namenode
是一个java进程(运行在jvm上的),用来存储HDFS的元数据。
什么是元数据?
- 文件存储的目录层级结构,以及目录里有哪些文件。
- 文件被分为了多少个block块,这些block块分别存储在哪些datanode上面的
filesystem namespace 说明:
- hdfs中的数据都是以目录和文件的形式来组织的。
- hdfs中又很多的目录,比如/a, /b, /c, /a 下面还有 /a/hello, /a/hi 之类的子目录。然后底层的目录还有/a/hello/ddd.txt 这种文件。
- 上面说的这种的目录和文件的层级结构和对应关系,就是所谓的 filesystem namespace(文件系统命名空间)
datanode
datanode节点是用来管理当前这个节点上的真实数据的。数据都是以block块的形式存储,datanode就是对这些block块进行管理。
而上面说的namenode,会对这些datanode做管理,一份大文件会被切割成一个个的block块,而这些block块会被存在哪些datanode上,是由namenode来决定的。
edits log 文件
修改元数据的日志文件。每一次对元数据的修改,都会对应一条edits log,这个会存储到本地磁盘上。
fsimage 文件
镜像文件。元数据的镜像文件。
- 进程刚启动的时候该文件为空的。
- 第一次重启的时候,namenode 会将edits log 和 fsimage 数据加载进内存合并,并将合并的数据写回到 fsimage 中。这时 fsimage 中就有了数据了。
之所以需要fsimage,是为了防止edits log变得很大的,如果只使用edigs log来恢复内存元数据,会让启动时间变得非常的长。
SecondaryNamenode
Hadoop 1.x里面的东西。
上面说了,如果 namenode 进程一直运行的话,时间一长,edits log就会变得非常的大,那下次重启加载edits log就会要花很长的时间。为了解决这个问题,hadoop 1.x 提出了一个 SecondaryNamenode 这个概念。SecondaryNamenode 在namenode 中的 edits log达到了一定的条数或者间隔一定的时间,会拉取edits log 和 fsimage,并对它两做一个合并,写回到 SecondaryNamenode的 fsimage 文件,并且将这个新的 fsimage 文件会同步回 namenode。
- checkpoint 操作
指 SecondaryNamenode 进程将 Namenode 进程的 edits log 和 fsimage 数据拉过来,进行合并,并生成新的 fsimage 文件,发送到 namenode 替换掉 namenode 上的 fsimage,并且将 namenode 上的 edits log 清空,这个完整的操作叫做一次 checkpoint。
BackupNode
Hadoop 1.x里面的东西。用的比较少。
此机制下, namenode 不在本地磁盘存储 edits log,而是将 edits log 发送到 BackupNode 上, BackupNode 进行 edits log 本地落盘。
每次执行 checkpoint, BackupNode 将自己的元数据 存到磁盘生成 fsimage 文件。 期望是,替换 SecondaryNamenode 不断拉文件合并文件。 国内用的比较少。
active namenode、standby namenode
hadoop 2.x 里的概念。
hadoop 1.x 中存在数据丢失的风险,为了解决这个问题 hadoop 2.x 做了优化。提出了 active namenode、standby namenode 的概念。 相当于是 namenode 的主从概念。 active namenode 节点挂了,需要重新选举,从standby namenode 中选出一个新的成为 active namenode。
journal node
hadoop 2.x 中用来保存 edits log 的。每次 namenode 有一个元数据变更,就要将这个 edits log 发送给 journal node 里的大多数, 就是quorum,比如说 journal node 是3个节点, 大多数就是 3/2 + 1 = 2,2台就是大多数了,只要 namenode 发送 edits log 到大多数的 journal node 了,就认为这个元数据的变更是安全的。
standby namenode 就一直监控着 journal node 里的 edits log 的变更,主要变更了就会读取 edits log,同时应用到自己本地的内存中去,形成一个跟 active namenode 一直的 fsiamge 数据在内存里。
ZKFC进程(ZKFailoverController)
hadoop 2.x里面的概念。
每个 namenode 进程上都有一个 ZKFC 进程。进来做 namenode 节点的存活状态监控,以及主备的选举和切换。 选举依赖的是Zookeeper的选举。
如果说 active namenode 挂掉了, 那么此时 standby namenode 立刻就能感知到,通过ZKFC进程来感知的。感知到过后,ZKFC会进行准备重新选举,选出新的 active namenode,完成故障的自动切换。