聯邦解決內存受限問題。node
創建多個NameNode,每一個NameNode記錄元數據的一部分,可是對於元數據總體來講本質上仍是隻有一份。mysql
HA(high available)高可用,解決hdfs的單點故障問題。sql
主備namenode,存儲相同的數據,若是主NameNode發生故障,則切換到備用Namenode上。apache
1.與客戶端創建鏈接,處理客戶端的請求,bootstrap
2.向JNN寫入edits log文件,超過半數的JNN節點收到就行。服務器
1.standbyNameNode會監視任何對edit log 的修改,一旦edits log出現更改,StandbyNameNode就會根據edits log更新本身的元數據網絡
2.合併edits log和fsimage文件ssh
合併的時機:1.一小時;2.超過1 000 000萬次事務(三秒鐘檢查一次事務數量)分佈式
3.當ActiveNameNode發生故障轉移時,standbyNameNode主機會先確認本身已經讀取了JNS上的全部更改來同步自己的元數據,而後由Standby狀態切換爲Active狀態。ide
爲了確保在發生故障轉移時,NameNode擁有相同的數據塊位置信息,DNS向全部的NameNode發送數據塊位置信息和心跳數據。
JNs只容許一臺NameNode向JNs寫edits log數據,這樣就能保證不會發生「腦裂」。
經過命令實現主備之間的切換,能夠用在HDFS升級等場合
基於zookeeper實現,zookeeper分佈式鎖實現統一時間只有一個namenode得到節點
Zookeeper Failover Controller:監控namenode健康狀態,並向zookeeper註冊namenode
1.監控本機namenode的狀態
2.與zookeeper創建鏈接,保持心跳
3.當沒有active namenode的時候爲當前的namenode在zookeeper上搶佔臨時節點,得到節點爲activeNameNode
4.若是當前的namenode不健康,讓zookeeper刪除臨時節點,讓對方搶佔
5.若是zkfc退出,zookeeper臨時節點消失,對方搶佔
1.規劃
2.搭建步驟
a) 將zookeeper.tar.gz上傳到node二、node三、node4
b) 解壓到/opt
tar -zxf zookeeper-3.4.6.tar.gz -C /opt
c) 配置環境變量:
export ZOOKEEPER_PREFIX=/opt/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_PREFIX/bin
而後 . /etc/profile讓配置生效
d) 到$ZOOKEEPER_PREFIX/conf下
複製zoo_sample.cfg爲zoo.cfg
cp zoo_sample.cfg zoo.cfg
e) 編輯zoo.cfg
添加以下行:
server.1=node2:2881:3881
server.2=node3:2881:3881
server.3=node4:2881:3881
修改
dataDir=/var/bjsxt/zookeeper/data
f) 建立/var/bjsxt/zookeeper/data目錄,並在該目錄下放一個文件:myid
在myid中寫下當前zookeeper的編號
mkdir -p /var/bjsxt/zookeeper/data
echo 3 > /var/bjsxt/zookeeper/data/myid
2181 用戶客戶端鏈接zk集羣的端口
zkCli.sh 客戶端啓動腳本
zkServer.sh 服務端啓動腳本
mysql -uroot -p123456
mysqld 服務端
g) 將/opt/zookeeper-3.4.6經過網絡拷貝到node二、node3上
scp -r zookeeper-3.4.6/ node2:/opt
scp -r zookeeper-3.4.6/ node3:/opt
h) 在node2和node3上分別建立/var/bjsxt/zookeeper/data目錄,並在該目錄下放一個文件:myid
node2:
mkdir -p /var/bjsxt/zookeeper/data
echo 1 > /var/bjsxt/zookeeper/data/myid
node3:
mkdir -p /var/bjsxt/zookeeper/data
echo 2 > /var/bjsxt/zookeeper/data/myid
i) 啓動zookeeper
zkServer.sh start 啓動zk
zkServer.sh stop 中止zk
zkServer.sh status 查看zk狀態
zkServer.sh start|stop|status
j) 關閉zookeeper
zkServer.sh stop
l) 鏈接zookeeper
zkCli.sh node二、node三、node4均可以
m) 退出zkCli.sh命令
quit
一概在node1上操做,作完後scp到node二、node三、node4
hadoop-env.sh配置JDK
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> hdfs://node1:9000 </property> <property> <name>hadoop.tmp.dir</name> <value>/var/bjsxt/hadoop/ha</value> </property> <!-- 指定每一個zookeeper服務器的位置和客戶端端口號 --> <property> <name>ha.zookeeper.quorum</name> <value>node2:2181,node3:2181,node4:2181</value> </property> </configuration>
<configuration> <!-- 指定block默認副本個數 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 用於解析fs.defaultFS中hdfs://mycluster中的mycluster地址 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- mycluster下面由兩個namenode服務支撐 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!--指定nn1的地址和端口號,發佈的是一個hdfs://的服務--> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node2:8020</value> </property> <!--指定三臺journal服務器的地址--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> </property> <!-- 指定客戶端查找active的namenode的策略: 會給全部namenode發請求,以決定哪一個是active的 --> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--在發生故障切換的時候,ssh到對方服務器,將namenode進程kill掉 kill -9 55767--> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_dsa</value> </property> <!-- 指定journalnode在哪一個目錄存放edits log文件 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/bjsxt/hadoop/ha/jnn</value> </property> <!--啓用自動故障切換--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
scp -r $HADOOP_HOME/etc/hadoop/* node[234]:/opt/hadoop-2.6.5/etc/hadoop/
0)啓動zookeeper集羣
a) 在node1\node2\node3上啓動三臺journalnode
hadoop-daemon.sh start journalnode
b) 任意選擇node1,格式化HDFS
hdfs namenode -format
格式化後,啓動namenode進程
hadoop-daemon.sh start namenode
c) 在另外一臺node2上同步元數據
hdfs namenode -bootstrapStandby
d) 初始化zookeeper上的內容 必定是在namenode節點上。
hdfs zkfc -formatZK
e) 啓動hadoop集羣,可在node1到node4這四臺服務器上任意位置執行
start-dfs.sh
stop-dfs.sh中止hadoop服務。
在node2或者node3或者node4上運行
zkCli.sh
ls /hadoop-ha/mycluster 查看臨時文件
get /hadoop-ha/mycluster/ActiveStandbyElectorLock 查看臨時文件的內容
退出zkCli.sh
quit
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
/user/root是用戶root家目錄
首先
stop-dfs.sh
其次,中止zookeeper集羣
node二、node三、node4上執行:
zkServer.sh stop