在上一篇文章《hadoop2.0 federation的配置》中介绍了单独配置federation,本文继续介绍同时配置HA和federation。关于zookeeper的安装和配置,这里不做介绍,大家可以参考网上的资料。

1 准备  

假定已经有一个zookeeper集群,包含3个zookeeper节点:

  • zookeeper1

  • zookeeper2

  • zookeeper3

另外,还有4个namenode节点:

  • namenode1

  • namenode2

  • namenode3

  • namenode4

和3个journalnode节点:

  • journalnode1

  • journalnode2

  • journalnode3

其他机器角色本文中不涉及的可以参考《hadoop2.0的安装和基本配置》一文。

2 federation和HA的结构  

我们假定hadoop集群的clusterid是hellokitty,有2个namespace/name service,分别是“mycluster”和“yourcluster”,分别挂载在viewfs的“/my”和“/your”目录下。

“mycluster”和“yourcluster”都配置成HA。其中“mycluster”的两个主备namenode节点分别是namenode1和namenode2,NN_ID分别是“nn1”和“nn2”;“yourcluster”的两个主备namenode节点分别是namenode3和namenode4,NN_ID分别是的“nn1”和“nn2”。

如下图所示:

wKiom1NCniSBxZDAAAIsuhQfdI0669.jpg

3 federation和HA的配置  

federation和HA的配置只涉及到core-site.xml和hdfs-site.xml两个配置文件,其他配置可以文件参考《hadoop2.0的安装和基本配置》一文。

为了简单起见,我们先不配置HA的自动切换,后面再把HA的自动切换配置上。

3.1 core-site.xml  
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>viewfs:///</value>
        </property>
        <property>
                <name>fs.viewfs.mounttable.default.link./my</name>
                <value>hdfs://mycluster/</value>
        </property>
        <property>
                <name>fs.viewfs.mounttable.default.link./your</name>
                <value>hdfs://yourcluster/</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/home/tmp/hadoop2.0</value>
        </property>
</configuration>
3.2 hdfs-site.xml  
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
       <property>
                <name>dfs.namenode.name.dir</name>
                <value>/home/dfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/home/dfs/data</value>
        </property>
        <property>
                <name>dfs.datanode.edit.dir</name>
                <value>/home/dfs/edit</value>
        </property>
        <property>
                <name>dfs.permissions</name>
                <value>false</value>
        </property>
        <property>
                <name>dfs.nameservices</name>
                <value>mycluster,yourcluster</value>
        </property>
        <property>
                <name>dfs.ha.namenodes.mycluster</name>
                <value>nn1,nn2</value>
        </property>
        <property>
                <name>dfs.ha.namenodes.yourcluster</name>
                <value>nn1,nn2</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn1</name>
                <value>namenode1:8020</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                <value>namenode2:8020</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.yourcluster.nn1</name>
                <value>namenode3:8020</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.yourcluster.nn2</name>
                <value>namenode4:8020</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.mycluster.nn1</name>
                <value>namenode1:50070</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.mycluster.nn2</name>
                <value>namenode2:50070</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.yourcluster.nn1</name>
                <value>namenode3:50070</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.yourcluster.nn2</name>
                <value>namenode4:50070</value>
        </property>
<!--dfs.namenode.shared.edits.dir的配置在namenode1和namenode2上用以下这个-->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value>
        </property>
<!--dfs.namenode.shared.edits.dir的配置在namenode3和namenode4上用以下这个
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/yourcluster</value>
        </property>
-->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/home/dfs/journal</value>
        </property>
        <property>      
                <name>dfs.client.failover.proxy.provider.mycluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
                <name>dfs.client.failover.proxy.provider.yourcluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>shell(/bin/true)</value>
        </property>
</configuration>
  • dfs.namenode.shared.edits.dir

这个参数要注意,在两组HA中的值是不一样的,即在“mycluster”(namenode1和namenode2)和是“yourcluster”(namenode3和namenode4)中是不同。

4 启动  

4.1 先启动journalnode,在journalnode节点上执行以下命令  
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
4.2 在namenode1和namenode3上执行格式化命令并启动namenode  
$HADOOP_HOME/bin/hdfs namenode -format –clusterId hellokitty
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
4.3 在namenode2和namenode4上执行bootstrapStandby命令并启动namenode  
$HADOOP_HOME/sbin/hadoop-daemon.sh start  namenode -bootstrapStandby
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode

这时namenode1,namenode2,namenode3,namenode4四个namenode都是“standby”状态。

4.4 在namenode1和namenode3执行以下命令,切换成“active”状态  
$HADOOP_HOME/bin/hdfs haadmin -transitionToActive nn1
4.5 在datanode节点上启动datanode  
$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode

5 检查和测试  

查看namenode1,namenode2,namenode3,namenode4的HDFS的监控页面,都能看到所有的datanode

http://namenode1:50070/dfshealth.jsp

http://namenode2:50070/dfshealth.jsp

http://namenode3:50070/dfshealth.jsp

http://namenode4:50070/dfshealth.jsp

其中namenode1和namenode3为“active”状态,namenode2和namenode4为“standby”状态。

可以参考《hadoop2.0 federation的配置》和《hadoop2.0 QJM方式的HA的配置》运行HDFS命令测试federation和HA的特性是否生效。

6 配置HA的主备自动切换  

我们接着通过配置zookeeper把HA主备自动切换的特性加上。

6.1 在core-site.xml加上以下参数  
<property>
        <name>ha.zookeeper.quorum</name>
        <value>zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</value>
</property>
6.2 在hdfs-site.xml加上以下参数  
<property>
         <name>dfs.ha.automatic-failover.enabled</name>
         <value>true</value>
</property>
6.3在zookeeper中初始化  
$HADOOP_HOME/bin/hdfs zkfc -formatZK

运行这个命令后,会在zookeeper上创建一个/hadoop-ha/mycluster/的znode,用来存放automatic failover的数据。

6.4 启动zkfc daemon进程  
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc

在namenode1,namenode2,namenode3,namenode4上都启动zkfc daemon进程。    

这样2组HA的主备自动切换就配置好了,可以参考《hadoop2.0 HA的主备自动切换》测试是否生效。

7 实战tips  

federation并不能解决namenode的单点问题,因此在实践中需要给federation的每个namenode都配置成HA,才能解决namenode的单点问题。

参考资料:  

http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html

http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-hdfs/Federation.html