hadoop2.5.2HA高可靠性集群搭建(zookeeper3.4.6+hbase0.98.11)
在hadoop2中新的NameNode不再是只有一个,可以有多个(目前只支持2个)。每一个都有相同的职能。 一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的 NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自 动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可靠。 在这里,2个NameNode的数据其实是实时共享的。新HDFS采...
在hadoop2中新的NameNode不再是只有一个,可以有多个(目前只支持2个)。每一个都有相同的职能。
一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可靠。
在这里,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,JournalNode集群或者NFS进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享。
这就需要使用ZooKeeper集群进行选择了。HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。
一、配置前准备
1、SSH免登陆(略)
2、文件/etc/profile
export PATH=.:$PATH export CLASSPATH=.:$CLASSPATH #java export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin #zookeeper export ZOOKEEPER_HOME=/home/mars/zookeeper export CLASSPATH=$CLASSPATH:$ZOOKEEPER_HOME/lib export PATH=$PATH:$ZOOKEEPER_HOME/bin #hadoop export HADOOP_HOME=/home/mars/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop/ export CLASSPATH=$CLASSPATH:$HADOOP_HOME/lib export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin #hbase export HBASE_HOME=/home/mars/hbase export CLASSPATH=$CLASSPATH:$HBASE_HOME/lib export PATH=$PATH:$HADOOP_HOME/bin
配置后需要执行
source /etc/profile
才会生效
3、文件/etc/host
127.0.0.1 localhost 192.168.16.217 os1 192.168.16.218 os2 192.168.16.212 os3 192.168.16.213 os4 192.168.16.214 os5
配置后需要执行
source /etc/hosts
才会生效
二、配置详细
1、各机器职责
机器有限,我这里选用5台机器配置,各自职责如下
进程 | os1 | os2 | os3 | os4 | os5 | |
NN | NameNode | 是 | 是 | 不是 | 不是 | 不是 |
DN | DateNode | 是 | 是 | 是 | 是 | 是 |
JN | JournalNode | 是 | 是 | 是 | 不是 | 不是 |
Zoo | QuorumPeerMain | 是 | 是 | 是 | 不是 | 不是 |
yarn | ResourceManager | 是 | 不是 | 不是 | 不是 | 不是 |
NodeManager | 是 | 是 | 是 | 是 | 是 | |
hbase | HMaster | 不是 | 是 | 不是 | 不是 | 不是 |
HRegionServer | 是 | 是 | 是 | 是 | 是 | |
ZKFC | DFSZKFailoverController | 是 | 是 | 不是 | 不是 | 不是 |
配置文件一共包括6个,分别是hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml和slaves。
2、文件hadoop-env.sh
修改一行配置
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
3、文件core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://whcx</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/mars/hadoop/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>os1:2181,os2:2181,os3:2181</value> </property> </configuration>
4、文件hdfs-site.xml
<configuration> <property> <name>dfs.name.dir</name> <value>/home/mars/hadoop/tmp/name</value> </property> <property> <name>dfs.data.dir</name> <value>/home/mars/hadoop/tmp/data,/sas/hadoop/data</value> <!-- /sas/hadoop/data 这台电脑挂载了另一个盘 --> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.nameservices</name> <value>whcx</value> </property> <property> <name>dfs.ha.namenodes.whcx</name> <value>os1,os2</value> </property> <property> <name>dfs.namenode.rpc-address.whcx.os1</name> <value>os1:9000</value> </property> <property> <name>dfs.namenode.http-address.whcx.os1</name> <value>os1:50070</value> </property> <property> <name>dfs.namenode.rpc-address.whcx.os2</name> <value>os2:9000</value> </property> <property> <name>dfs.namenode.http-address.whcx.os2</name> <value>os2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://os1:8485;os2:8485;os3:8485/whcx</value> </property> <property> <name>dfs.ha.automatic-failover.enabled.whcx</name> <value>true</value> </property> <property> <name>dfs.client.failover.proxy.provider.whcx</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/mars/hadoop/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/mars/.ssh/id_rsa</value> </property> </configuration>
5、mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
6、yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>os1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
7、slaves
os1 os2 os3 os4 os5
8、zookeeper配置
zookeeper中/conf/zoo.cnf
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/home/mars/zookeeper/data clientPort=2181 server.1=os1:2888:3888 server.2=os2:2888:3888 server.3=os3:2888:3888
zookeeper中新建data目录,新建文件myid
os1中的myid编辑为1,os2中的myid编辑为2,os3中的myid编辑为3
9、hbase配置
文件hbase-site.xml
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://whcx/hbase</value><!--这里必须跟core-site.xml中的配置一样--> </property> <!-- 开启分布式模式 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 这里是对的,只配置端口,为了配置多个HMaster --> <property> <name>hbase.master</name> <value>os2:60000</value> </property> <property> <name>hbase.tmp.dir</name> <value>/home/mars/hbase/tmp</value> </property> <!-- Hbase的外置zk集群时,使用下面的zk端口 --> <property> <name>hbase.zookeeper.quorum</name> <value>os1:2181,os2:2181,os3:2181</value> </property> </configuration>
三、启动过程
1、启动Zookeeper集群
分别在os1、os2、os3上执行
zkServer.sh start
然后执行
zkServer.sh status
查看是否启动,确保启动后执行后面的步骤
三个节点都启动后,执行
zkCli.sh
然后执行
ls /
查看Zookeeper集群中是否有HA节点
2、格式化Zookeeper集群,目的是在Zookeeper集群上建立HA的相应节点
在os1上执行
hdfs zkfc –formatZK
(注意,这条命令最好手动输入,直接copy执行有可能会有问题)
格式化后验证,执行
zkCli.sh
在执行
ls /
会出现下图中红色部分
则表示格式化成功
ls /hadoop-ha
会出现我们配置的HA集群名称
3、启动Journal集群
分别在os1、os2、os3上执行
hadoop-daemon.sh start journalnode
4、格式化集群上的一个NameNode
从os1和os2上任选一个即可,这里我是在os1
hdfs namenode -format -clusterId ss
5、启动集群中步骤4中的NameNode
启动os1上的NameNode
hadoop-daemon.sh start namenode
6、把NameNode的数据同步到另一个NameNode上
把NameNode的数据同步到os2上
hdfs namenode –bootstrapStandby
这条命令依旧需要手动敲
同步数据还有另一种方法
直接copy数据到os2上
scp -r /home/mars/hadoop/tmp mars@os2:/home/mars/hadoop/tmp
如果第一种方法同步失败可以采用第二种同步方法
7、启动另个一NameNode
在os2上执行
hadoop-daemon.sh start namenode
8、启动所有的DataNode
hadoop-daemon.sh start namenode
9、启动Yarn
start-yarn.sh
10、启动Hbase
start-hbase.sh
11、启动ZKFC
分别在os1、os2上执行
hadoop-daemon.sh start zkfc
至此配置成功
结束语
由于是测试环境,且机器有限,每个机器上职责重,如果是在实际生产中,个人认为,作为任务的分发分配,应该给ResourceManager分配一台机器,这台机器只仅仅只允许ResourceManager,journal集群也该分配三台机器来共享元数据。我这里的主节点同时也是从节点,实际生产中不会这么做。