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 configuration properties -->
<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.sh start journalnode
3、在ZooKeeper集群中初始化HA的状态(仅第一次需要执行)
在centos95、centos112上执行(namenodes节点上):
bin/hdfs zkfc -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节点上执行格式化:
./hdfs namenode -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.sh start zkfc
6、启动所有的datanode
在active namenode节点上执行:sbin/hadoop-daemons.sh start datanode
7、启动后的效果:
可以看出四者的Cluster ID是一致的。
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