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共同搭建。各个节点角色分配如下:
软件版本: 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> <description>此处是默认的HDFS路径,在节点centos94和centos105中使用cloud-1,在节点centos95和centos112中使用cloud-2</description> </property> <description>Zookeeper集群<description> </property> </configuration> 配置 slavesvi 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
|
|
来自: 春和秋荣 > 《HA与Federation》