Hadoop2.0中,2個NameNode的數據實際上是實時共享的。新HDFS採用了一種共享機制,Quorum Journal Node(JournalNode)集羣或者Nnetwork File System(NFS)進行共享。NFS是操做系統層面的,JournalNode是hadoop層面的,咱們這裏使用JournalNode集羣進行數據共享(這也是主流的作法)。以下圖所示,即是JournalNode的架構圖。java
兩個NameNode爲了數據同步,會經過一組稱做JournalNodes的獨立進程進行相互通訊。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變動信息,而且一直監控edit log的變化,把變化應用於本身的命名空間。standby能夠確保在集羣出錯時,命名空間狀態已經徹底同步了。node
對於HA集羣而言,確保同一時刻只有一個NameNode處於active狀態是相當重要的。不然,兩個NameNode的數據狀態就會產生分歧,可能丟失數據,或者產生錯誤的結果。爲了保證這點,這就須要利用使用ZooKeeper了。首先HDFS集羣中的兩個NameNode都在ZooKeeper中註冊,當active狀態的NameNode出故障時,ZooKeeper能檢測到這種狀況,它就會自動把standby狀態的NameNode切換爲active狀態。web
這裏搭建一個5臺服務器的集羣,固然最低三臺也能夠搭建。shell
Zookeeper版本:3.4.7apache
Hadoop版本:2.7.1bootstrap
如下爲每臺服務器的角色分配,能夠根據本身的服務器數量進行調整。vim
Zookeeper、NameNode、DFSZKFailoverController、ResourceManager。bash
Zookeeper、NameNode二、DFSZKFailoverController。服務器
Zookeeper、DataNode、NodeManager、JournalNode。架構
Zookeeper、DataNode、NodeManager、JournalNode。
Zookeeper、DataNode、NodeManager、JournalNode。
通常的生產環境不須要系統自帶的防火牆,若是沒有外置的防火牆也能夠開啓,可是要將通訊的端口等在防火牆中容許經過。這裏爲了實驗的簡單,就直接將防火牆關閉。
service iptables status #查看防火牆狀態 service iptables start #當即開啓防火牆,可是重啓後失效。 service iptables stop #當即關閉防火牆,可是重啓後失效。 #重啓後生效 chkconfig iptables on #開啓防火牆,重啓後生效。 chkconfig iptables off #關閉防火牆,重啓後生效。
修改文件 /etc/sysconfig/network
vim /etc/sysconfig/network
!!!!!注意安裝hadoop的集羣主機名不能有下劃線!!否則會找不到主機!沒法啓動!
source /etc/sysconfig/network
通過上面的修改,主機名稱不會立刻改變,必須重啓才能生效。因此可使用以下命令進行當即更改:
hostname
修改文件 /etc/hosts
vim /etc/hosts
填入如下內容
127.0.0.1 hadoop01 其餘主機和ip對應信息。。。
以上兩部操做是爲了實現ip的解耦,若是你在多個框架服務裏所有填寫的是ip那麼,一旦你服務器的ip發生改變,那麼每一個服務框架都須要修改ip,若是你設置的是主機名,那麼當你的服務器ip發生改變,只須要修改hosts文件中,主機名和ip的映射關係便可。
集羣中全部主機都要互相進行免密登陸。
生成密鑰:
ssh-keygen
發送公鑰:
ssh-copy-id root@hadoop01
此時在遠程主機的/root/.ssh/authorized_keys文件中保存了公鑰,在known_hosts中保存了已知主機信息,當再次訪問的時候就不須要輸入密碼了。
ssh hadoop01
經過此命令遠程鏈接,檢驗是否能夠不需密碼鏈接。
這裏須要注意的是必定要給本機也發送一下。
經過fz將jdk安裝包上傳、解壓安裝包,命令以下:
tar -zxvf [jdk安裝包位置]
修改/etc/profile。
這個文件是每一個用戶登陸時都會運行的環境變量設置,當用戶第一次登陸時,該文件被執行。並從/etc/profile.d目錄的配置文件中搜集shell的設置。
vim /etc/profile
在文件行尾加入如下內容後保存退出。
export JAVA_HOME=/home/app/jdk1.7.0_45/ export PATH=$PATH:$JAVA_HOME/bin
從新加載profile使配置生效。
source /etc/profile
環境變量配置完成,測試環境變量是否生效。
echo $JAVA_HOME java -version
參見:ZooKepper集羣搭建。
將安裝包上傳到服務器,進行解壓。
tar -zxvf hadoop-2.7.1_64bit.tar.gz
如下文件均爲Hadoop徹底分佈式須要配置的文件。此配置按照上述的5臺服務器組件的集羣。
在此文件中,將java的環境變量改成和/etc/profile文件中的java環境變量值一致便可。
JAVA_HOME=/home/app/jdk1.7.0_45/
如下爲此文件的配置模版。
<configuration> <!-- 指定hdfs的nameservice爲ns --> <property> <name>fs.defaultFS</name> <value>hdfs://ns</value> </property> <!--指定hadoop數據臨時存放目錄--> <property> <name>hadoop.tmp.dir</name> <value>/root/work/hadoop-2.7.1/tmp</value> </property> <!--指定hdfs操做數據的緩衝區大小 能夠不配--> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> <!--指定zookeeper地址--> <property> <name>ha.zookeeper.quorum</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181</value> </property> </configuration>
<configuration> <!--指定hdfs的nameservice爲ns,須要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns</value> </property> <!-- ns下面有兩個NameNode,分別是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>hadoop01:9000</value> </property> <!-- nn1的http通訊地址 --> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>hadoop01:50070</value> </property> <!-- nn2的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>hadoop02:9000</value> </property> <!-- nn2的http通訊地址 --> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>hadoop02:50070</value> </property> <!-- 指定NameNode的元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop03:8485;hadoop04:8485;hadoop05:8485/ns</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/root/work/hadoop-2.7.1/tmp/journal</value> </property> <!-- 開啓NameNode故障時自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.ns</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔離機制 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔離機制時須要ssh免登錄 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- namenode存儲位置 --> <property> <name>dfs.namenode.name.dir</name> <value>/root/work/hadoop-2.7.1/tmp/name</value> </property> <!-- dataode存儲位置 --> <property> <name>dfs.datanode.data.dir</name> <value>/root/work/hadoop-2.7.1/tmp/data</value> </property> <!-- 副本數量根據本身的需求配置,這裏配置2個 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 在NN和DN上開啓WebHDFS (REST API)功能,不是必須 --> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
<configuration> <!-- 指定nodemanager啓動時加載server的方式爲shuffle server --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定resourcemanager地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property> </configuration>
這裏咱們將hadoop0三、hadoop0四、hadoop05配置爲存儲數據的節點。
vim slaves
hadoop03 hadoop04 hadoop05
配置文件/etc/profile:
vim /etc/profile
在其末尾追加以下內容:
export HADOOP_HOME=[hadoop的安裝路徑] export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
使用scp命令將配置文件拷貝到其餘服務器上。
這裏要注意,若是其餘服務器的jdk,Zookeeper等配置和當前這臺服務器的配置是同樣的話,直接拷貝過去不用修改。
啓動徹底分佈式hadoop:
./zkServer.sh start
sbin/hadoop-daemons.sh start journalnode
第一次啓動要格式化
hdfs zkfc -formatZK
第一次啓動要格式化
hadoop namenode -format
在hadoop01上:
hadoop-daemon.sh start namenode
在hadoop02上:
hdfs namenode -bootstrapStandby #把NameNode的數據同步到hadoop02上 hadoop-daemon.sh start namenode #啓動備用的namenode
hadoop-daemons.sh start datanode
start-yarn.sh
在hadoop01
hadoop-daemon.sh start zkfc
在hadoop02
hadoop-daemon.sh start zkfc
啓動完成以後,使用jps命令查看各臺服務器,進程以下:
hadoop01:
10877 QuorumPeerMain 11351 NameNode 11871 DFSZKFailoverController 11570 ResourceManager
hadoop02:
16019 QuorumPeerMain 16214 NameNode 16344 DFSZKFailoverController
hadoop03:
16548 QuorumPeerMain 16783 DataNode 16893 NodeManager 16701 JournalNode
hadoop04:
16565 QuorumPeerMain 16798 DataNode 16908 NodeManager 16716 JournalNode
hadoop05:
16562 QuorumPeerMain 16809 DataNode 16919 NodeManager 16727 JournalNode
至此整個集羣搭建完成,能夠正常使用!
上一篇:Hadoop僞分佈式模式搭建