在我们安装高可用hadoop集群时,我们会按照以下命令去执行启动操作;

 (1)格式化zk

  hdfs zkfc -formatZK

 (2)启动journalnode进程

 (3)格式化namenode

  hadoop namenode -format 集群名

 (4)启动namenode

 (5)在备namenode节点同步元数据

 (6)启动备namenode

 (7)启动zkfc

那么我们为什么要对NameNode和Zookeeper进行format操作;

  1. NameNode进行format的作用

core-site.xml 是 NameNode 的核心配置文件,主要对 NameNode 的属性进行设置,也仅仅在 NameNode 节点生效,这里我用的是hadoop用户。

 
  hadoop.tmp.dir 
  /tmp/hadoop-${user.name} 

hadoop.tmp.dir存放临时数据的公共目录目录,如果没有配置,那么即为默认配置namenode、

journalnode和datanode的数据都会存放在此目录中,也可以单独配置在hdfs-site.xml文件中。

dfs.journalnode.edits.dir:指定JournalNode集群存储edits目录

dfs.namenode.name.dir:元数据目录

dfs.datanode.data.dir:数据目录

namenode进行format操作后会创建以下文件:

NameNode和Zookeeper的format作用_第1张图片

文件解释如下:
fsimage:存储命名空间(实际上就是目录和文件)的元数据信息;

edits:用来存储对命名空间操作的日志信息,实现NameNode节点的恢复;

VERSION:用来存储NameNode版本信息,命名空间ID(版本号);

editsinprogress:还在使用的edits文件。

  1. Zookeeper的format作用

    NameNode高可用和共享存储与ZooKeeper架构图
    NameNode和Zookeeper的format作用_第2张图片

zkfc是ZK集群的客户端,用来监控NN的状态信息。

主要功能如下:

  • 2.1 健康监控

    zkfc定期对本地的NN发起health-check的命令,如果NN正确返回,那么这个NN被认为是OK
    的。否则被认为是失效节点。
  • 2.2 Zookeeper会话管理

    当本地NN是健康的时候,zkfc将会在zk中持有一个session。如果本地NN又正好是active的,那么zkfc还有持有一个"ephemeral"的节点作为锁,一旦本地NN失效了,那么这个节点将会被自动删除。

    *2.3 基于Zookeeper的选举

    如果本地NN是健康的,并且zkfc发现没有其他的NN持有那个独占锁。那么他将试图去获取该锁,一旦成功,那么它就需要执行Failover,然后成为active的NN节点。Failover的过程是:第一步,对之前的NN执行fence,如果需要的话。第二步,将本地NN转换到active状态。


hdfs zkfc -formatZK 做了什么操作?

因为FC(failOver)需要把NN的状态写给ZK,所以命令这个就是为了创建一个父目录,后续fc会

把nn的状态写到这下面给zk看的。