在hadoop2中新的NameNode再也不是隻有一個,能夠有多個(目前只支持2個)。每個都有相同的職能。
java
一個是active狀態的,一個是standby狀態的。當集羣運行時,只有active狀態的NameNode是正常工做的,standby狀態的NameNode是處於待命狀態的,時刻同步active狀態NameNode的數據。一旦active狀態的NameNode不能工做,經過手工或者自動切換,standby狀態的NameNode就能夠轉變爲active狀態的,就能夠繼續工做了。這就是高可靠。node
在這裏,2個NameNode的數據實際上是實時共享的。新HDFS採用了一種共享機制,JournalNode集羣或者NFS進行共享。NFS是操做系統層面的,JournalNode是hadoop層面的,咱們這裏使用JournalNode集羣進行數據共享。apache
這就須要使用ZooKeeper集羣進行選擇了。HDFS集羣中的兩個NameNode都在ZooKeeper中註冊,當active狀態的NameNode出故障時,ZooKeeper能檢測到這種狀況,它就會自動把standby狀態的NameNode切換爲active狀態。bootstrap
1、配置前準備ssh
一、SSH免登錄(略)
jvm
二、文件/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
配置後須要執行ide
source /etc/profile
纔會生效oop
三、文件/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
纔會生效
2、配置詳細
一、各機器職責
機器有限,我這裏選用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。
二、文件hadoop-env.sh
修改一行配置
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
三、文件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>
四、文件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>
五、mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
六、yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>os1</value> <!-- resourcemanager在os1上 --> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
七、slaves
os1 os2 os3 os4 os5
八、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目錄,在data目錄下新建文件myid
和zoo.cnf中的配置保持一致,os1中的myid編輯爲1,os2中的myid編輯爲2,os3中的myid編輯爲3
九、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>
3、啓動過程
一、啓動Zookeeper集羣
分別在os一、os二、os3上執行
zkServer.sh start
而後執行
zkServer.sh status
查看是否啓動,確保啓動後執行後面的步驟
三個節點都啓動後,執行
zkCli.sh
而後執行
ls /
查看Zookeeper集羣中是否有HA節點
二、格式化Zookeeper集羣,目的是在Zookeeper集羣上創建HA的相應節點
在os1上執行
hdfs zkfc –formatZK
(注意,這條命令最好手動輸入,直接copy執行有可能會有問題)
格式化後驗證,執行
zkCli.sh
在執行
ls /
會出現下圖中紅色部分
則表示格式化成功
ls /hadoop-ha
會出現咱們配置的HA集羣名稱
三、啓動Journal集羣
分別在os一、os二、os3上執行
hadoop-daemon.sh start journalnode
四、格式化集羣上的一個NameNode
從os1和os2上任選一個便可,這裏我是在os1
hdfs namenode -format -clusterId ss
五、啓動集羣中步驟4中的NameNode
啓動os1上的NameNode
hadoop-daemon.sh start namenode
六、把NameNode的數據同步到另外一個NameNode上
把NameNode的數據同步到os2上
hdfs namenode –bootstrapStandby
這條命令依舊須要手動敲
同步數據還有另外一種方法
直接copy數據到os2上
scp -r /home/mars/hadoop/tmp mars@os2:/home/mars/hadoop/tmp
若是第一種方法同步失敗能夠採用第二種同步方法
七、啓動另個一NameNode
在os2上執行
hadoop-daemon.sh start namenode
八、啓動全部的DataNode
hadoop-daemons.sh start datanode
九、啓動Yarn
start-yarn.sh
十、啓動Hbase
start-hbase.sh
十一、啓動ZKFC
分別在os一、os2上執行
hadoop-daemon.sh start zkfc
至此配置成功
結束語
因爲是測試環境,且機器有限,每一個機器上職責重,若是是在實際生產中,我的認爲,做爲任務的分發分配,應該給ResourceManager分配一臺機器,這臺機器只僅僅只運行ResourceManager,journal集羣也該分配三臺機器來共享元數據。我這裏的主節點同時也是從節點,實際生產中不會這麼作。