Configuring HardWare For HDFS HA


为了使用Quorum-based存储去部署一个HA集群,应该做如下准备

1.NameNode:运行Active和Standbye的NameNode应该有等价的配置。

2.JournalNode:运行Journalnode的节点

3.JounalNode进程相对轻量,因此这些进程可以相对合理的和其他的进程并存,例如NameNode,JobTracker或者YARN。

4.Cloudera建议将JournalNode部署在“master”节点或者NameNode,Standby NameNode,Jobtracker等。

5.至少应该有3个JournalNode,edit log 的修改必须写入大多数的JournalNode,这样集群能够容忍节点出错的数量是一个;但是为了提高集群能够容忍出错节点的数量,我们可以有大于3个的JournalNode,并且数量为奇数个,

6.当运行N个JournalNode的时候,集群允许出错的数量最大为(N-1)/2,当超过限制后,将不能工作,会看见类似下面的错误

12/10/01 17:34:18 WARN namenode.FSEditLog: Unable to determine input streams from QJM to [10.0.1.10:8485, 10.0.1.10:8486, 10.0.1.10:8487]. Skipping.
java.io.IOException: Timed out waiting 20000ms for a quorum of nodes to respond.


Configuring SoftWare For HDFS HA


Core-site.xml配置

针对YARN的配置:


  fs.defaultFS
  hdfs://pezy

ha.zookeeper.quorum hadoop001:2181,hadoop002:2181,hadoop003:2181

【配置zookeeper集群】


针对MR1的配置


  fs.default.name
  hdfs://pezy




hdfs-site.xml配置



  dfs.nameservices
  pezy

【这是集群的逻辑名,可以自己定义,需和core-site.xml中配置的名字一致】

dfs.ha.namenodes.pezy nn1,nn2

【这是配置NameNode节点的逻辑名字,用逗号分隔,这个配置可以让DataNode知道集群中所有的NameNode】

dfs.namenode.rpc-address.pezy.nn1 hadoop001:8020 dfs.namenode.rpc-address.pezy.nn2 hadoop002:8020

【为NameNode进程设置完整地址和RPC端口】

dfs.namenode.http-address.pezy.nn1 hadoop001:50070 dfs.namenode.http-address.pezy.nn2 hadoop002:50070

【设置NameNode的HTTP地址】

dfs.namenode.shared.edits.dir qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster

【设置JournalNode的共享文件目录,Active NameNode负责写入,Standby NameNode负责读取】

dfs.journalnode.edits.dir /data/journalnode

【每一个journalNode节点中存储edits和其他的本地数据的位置】

dfs.client.failover.proxy.provider.pezy org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

【HDFS客户端通过这个JAVA类去和Active NameNode会话,通过该类可以让HDFS客户端知道哪个NameNode是Active状态】

dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /home/exampleuser/.ssh/id_rsa

【配置NameNode宕机后的恢复策略】

dfs.ha.automatic-failover.enabled true

【开启自动恢复策略】


启动过程:

1.各个节点启动zookeeper

2.在一个NameNode节点:hadoop zkfc -formatZK

3.格式化一个NameNode:hdfs namenode -format

4.启动刚格式化的NameNode:hadoop-daemon.sh start namenode

5.在另一个NameNode中复制前面格式化的信息:

6.启动这个NameNode

7.启动zkfc

8.启动所有DataNode:hadoop-daemons.sh start datanode(注意S)