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的配置:

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://pezy</value>

</property>

<property> <name>ha.zookeeper.quorum</name> <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>

</property>

【配置zookeeper集群】


针对MR1的配置

<property>
  <name>fs.default.name</name>
  <value>hdfs://pezy</value>
</property>




hdfs-site.xml配置


<property>
  <name>dfs.nameservices</name>
  <value>pezy</value>

</property>

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

<property> <name>dfs.ha.namenodes.pezy</name> <value>nn1,nn2</value>

</property>

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

<property> <name>dfs.namenode.rpc-address.pezy.nn1</name> <value>hadoop001:8020</value> </property> <property> <name>dfs.namenode.rpc-address.pezy.nn2</name> <value>hadoop002:8020</value>

</property>

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

<property> <name>dfs.namenode.http-address.pezy.nn1</name> <value>hadoop001:50070</value> </property> <property> <name>dfs.namenode.http-address.pezy.nn2</name> <value>hadoop002:50070</value> </property>

【设置NameNode的HTTP地址】

<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value> </property>

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

<property> <name>dfs.journalnode.edits.dir</name> <value>/data/journalnode</value>

</property>

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

<property> <name>dfs.client.failover.proxy.provider.pezy</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

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

<property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/exampleuser/.ssh/id_rsa</value>

</property>

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

<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value>

</property>

【开启自动恢复策略】


启动过程:

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)