首页 > 代码库 > HDFS Federation和NameNode HA的搭建

HDFS Federation和NameNode HA的搭建

1. HDFS Federation产生背景

    在Hadoop 1.0中,HDFS的单NameNode设计带来诸多问题,包括单点故障、内存受限制约集群扩展性和缺乏隔离机制(不同业务使用同一个NameNode导致业务相互影响)等,为了解决这些问题,Hadoop 2.0引入了基于共享存储的HA解决方案和HDFS Federation,这里重点介绍HDFS Federation。

    HDFS Federation是指HDFS集群可同时存在多个NameNode,这些NameNode分别管理一部分数据,且共享所有DataNode的存储资源。这种设计可解决单NameNode存在的以下几个问题:

(1)HDFS集群扩展性。多个NameNode分管一部分目录,使得一个集群可以扩展到更多节点,不再像1.0中那样由于内存的限制制约文件存储数目。

(2)性能更高效。多个NameNode管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐率。

(3)良好的隔离性。用户可根据需要将不同业务数据交由不同NameNode管理,这样不同业务之间影响很小。

需要注意的,HDFS Federation并不能解决单点故障问题,也就是说,每个NameNode都存在在单点故障问题,你需要为每个namenode部署一个backup namenode以应对NameNode挂掉对业务产生的影响。

2.安装环境

由于HDFS federation仍然存在单点故障问题,所以我们考虑HA和HDFS federation共同搭建。各个节点角色分配如下:

用户名

ip地址

NameNode

(active)

secondarynamenode

NameNode

(standby)

JournalNode

DataNode

Zookeeper

归属组

centos94

192.168.1.94

Y

Y

 

 

Y

 

cloud-1

centos105

192.168.1.105

 

Y

Y

 

Y

 

centos95

192.168.1.95

Y

Y

 

Y

Y

Y

cloud-2

centos112

192.168.1.112

 

Y

Y

Y

Y

Y

centos111

192.168.1.111

 

 

 

Y

Y

Y

 

 

软件版本:

hadoop:hadoop-2.2.0.tar.gz(利用源码自编译后适用于64位系统)

zookeeper:zookeeper-3.4.6.tar.gz

 

前期具体的安装环境准备请参考文档:《Hadoop、HBase、Hive整合安装文档》

下面主要是一些参数设置:

HA + Federation,所有节点共同部分hdfs-site.xml

<property>

   <name>dfs.namenode.name.dir</name>

   <value>/home/admin/hadoop-2.2.0/dfs/name</value>

</property>

<property>

    <name>dfs.datanode.data.dir</name>

    <value>/home/admin/hadoop-2.2.0/dfs/data</value>

 </property>

<property>

    <name>dfs.nameservices</name>

    <value>cloud-1, cloud-2</value>

</property>

<property>

    <name>dfs.replication</name>

    <value>3</value>

</property>

<property>

    <name>dfs.ha.namenodes.cloud-1</name>

    <value>centos94,centos105</value>

</property>

<property>

    <name>dfs.ha.namenodes.cloud-2</name>

    <value>centos95,centos112</value>

</property>

<property>

    <name>dfs.namenode.rpc-address.cloud-1.centos94</name>

    <value>centos94:9000</value>

</property>

<property>

    <name>dfs.namenode.http-address.cloud-1.centos94</name>

    <value>centos94:50070</value>

</property>

<property>

    <name>dfs.namenode.rpc-address.cloud-1.centos105</name>

    <value>centos105:9000</value>

</property>

 

<property>

    <name>dfs.namenode.http-address.cloud-1.centos105</name>

    <value>centos105:50070</value>

</property>

<property>

    <name>dfs.namenode.rpc-address.cloud-2.centos95</name>

    <value>centos95:9000</value>

</property>

<property>

    <name>dfs.namenode.http-address.cloud-2.centos95</name>

    <value>centos95:50070</value>

</property>

<property>

    <name>dfs.namenode.rpc-address.cloud-2.centos112</name>

    <value>centos112:9000</value>

</property>

<property>

    <name>dfs.namenode.http-address.cloud-2.centos112</name>

    <value>centos112:50070</value>

</property>

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/home/admin/hadoop-2.2.0/tmp/journal</value>

</property>

<property>

<name>dfs.ha.fencing.methods</name>

<value>sshfence</value>

</property>

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/home/admin/.ssh/id_rsa</value>

</property>

在cloud-1和cloud-2中不一样的配置:

cloud-1

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://centos95:8485;centos111:8485;centos112:8485/cloud-1</value>

<description>指定cloud-1的两个NameNode共享edits文件目录时,使用的是JournalNode集群来维护</description>

</property>

<property>

<name>dfs.ha.automatic-failover.enabled.cloud-1</name>

<value>true</value>

</property>

<property>

<name>dfs.client.failover.proxy.provider.cloud-1</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

cloud-2

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://centos95:8485;centos111:8485;centos112:8485/cloud-2</value>

<description>指定cloud-2的两个NameNode共享edits文件目录时,使用的是JournalNode集群来维护</description>

</property>

<property>

<name>dfs.ha.automatic-failover.enabled.cloud-2</name>

<value>true</value>

</property>

<property>

<name>dfs.client.failover.proxy.provider.cloud-2</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

配置:core-site.xml(所有节点)

<configuration>

<property>
 <name>fs.defaultFS</name>
<value>hdfs://cloud-1</value>

<description>此处是默认的HDFS路径,在节点centos94和centos105中使用cloud-1,在节点centos95和centos112中使用cloud-2</description>

</property>
<property>
 <name>hadoop.tmp.dir</name>
 <value>/home/admin/hadoop-2.2.0/tmp</value>
</property>
<property>
 <name>ha.zookeeper.quorum</name>
<value>centos95:2181,centos111:2181,centos112:2181</value>

 <description>Zookeeper集群<description>

</property>

</configuration>

配置 slaves

vi slaves

centos94

centos95

centos111

centos112

centos105

配置mapred-site.xml(所有节点)

<configuration>

<property>

 <name>mapreduce.framework.name</name>

 <value>yarn</value>

 </property>

</configuration>

配置yarn-site.xml(所有节点)

<configuration>

<!-- Site specific YARN configurationproperties -->

<property>

 <name>yarn.nodemanager.aux-services</name>

 <value>mapreduce_shuffle</value>

 </property>

 <property>

 <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>

 <value>org.apache.hadoop.mapred.ShuffleHandler</value>

 </property>

</configuration>

启动:

1、启动Zookeeper

在centos95、centos111、centos112上执行

   bin/zkServer.sh start

2、启动JournalNode

在centos95、centos111、centos112上执行:

    sbin/hadoop-daemon.shstart journalnode

3、ZooKeeper集群中初始化HA的状态(仅第一次需要执行)

在centos95、centos112上执行(namenodes节点上):

    bin/hdfszkfc -formatZK

    在创建Federation环境的时候,需要注意保持${CLUSTER_ID}的值,以确保所有NN能共享同一个集群的存储资源,具体做法是在格式化第一台NN之后,取得其${CLUSTER_ID}的值,然后用如下命令格式化其他NN:

hdfs namenode -format -clusterid${CLUSTER_ID}

4、在cloud-1的centos94节点上执行格式化(只有在第一次启动时需要进行格式化):

./hdfs namenode -format -clusterId hadoop(自己指定名称或者由集群自己生成)

sbin/hadoop-daemon.sh start namenode

生成的hadoop-cluster这个ID是整个集群共用的。保证两个NameService可以共享所有的DataNodes,否则两个NameService在format之后,生成的clusterid不一致,DataNode会随机注册到不同的NameNode上。

对centos105(备用NN)节点同步主NN的元数据信息:

bin/hdfs namenode -bootstrapStandby

启动备NN:

sbin/hadoop-daemon.sh start namenode

在centos94、centos105上启动zkfc:

sbin/hadoop-daemon.sh start zkfc

执行后, hadoop0、hadoop1有一个节点就会变为active状态。

5、在cloud-2的centos95节点上执行格式化:

   ./hdfsnamenode -format -clusterId hadoop

sbin/hadoop-daemon.sh start namenode

对centos112(备用NN)节点同步主NN的元数据信息:

bin/hdfs namenode -bootstrapStandby

启动备NN:

sbin/hadoop-daemon.sh start namenode

    在centos95、centos112上启动zkfc:

    sbin/hadoop-daemon.shstart zkfc

6、启动所有的datanode

   在active namenode节点上执行:sbin/hadoop-daemons.sh startdatanode

7、启动后的效果:

      

可以看出四者的ClusterID是一致的。

 

8、启动YARN

   在centos94节点上执行:

   sbin/start-yarn.sh

9、关闭集群

    在RM和NN所在节点master执行:

    停止yarn:

   stop-yarn.sh

    停止hdfs:

   stop-dfs.sh

    停止zookeeper:

   zkServer.sh stop

10、总结

     问题1:格式化后两个namespace的CID不一致。

     解决办法:删除所有的tmp文件和dfs文件,重新格式化启动。

11、配置federation和HA后的hadoop集群安装hbase集群

在每一个federation内配置hbase集群,有几个federation就有几个hbase集群,而hbase集群之间是平行孤立的。需要把各个federation内hadoop配置文件hdfs-site.xml文件放置在hbase的conf目录下,然后把hbase.rootdir配置成联邦前缀。

12、问题解决方法

 NN从non-HA转到HA后,要清空/hbase/splitWAL

 在zookeeper node做下面的步骤

 1.运行/usr/lib/zookeeper/bin/zkCli.sh

 2.ls /hbase/splitWAL,如果存在,运行第三步

 3.rmr /hbase/splitWAL

 4.重启HBase

 把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下,然后重启HBase.

13、传统hadoop模式(主从结构)下hmaster启动失败处理方式(在不存在数据的情况下)

 1.运行~/zookeeper/bin/zkCli.sh

 2.ls /hbase/splitWAL,如果存在,运行第三步

 3.rmr /hbase/splitWAL

 4.重启HBase

 

 

  

HDFS Federation和NameNode HA的搭建