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集群也該分配三臺機器來共享元數據。我這里的主節點同時也是從節點,實際生產中不會這么做。