1)集群規划:
主機名 IP 安裝的軟件 運行的進程
master 192.168.199.130 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
slaver1 192.168.199.131 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
slaver2 192.168.199.132 jdk、hadoop ResourceManager
slaver3 192.168.199.133 jdk、hadoop ResourceManager
slaver4 192.168.199.134 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
slaver5 192.168.199.135 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
slaver6 192.168.199.136 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
2)注意:hadoop-2.6.4又增加了YARN HA:apache提供的hadoop-2.6.4的安裝包是在32位操作系統編譯的,因為hadoop依賴一些C++的本地庫,所以如果在64位的操作上安裝hadoop-2.6.4就需要重新在64操作系統上重新編譯
(建議第一次安裝用32位的系統,我將編譯好的64位的也上傳到群共享里了,如果有興趣的可以自己編譯一下)3)說明:
a:在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這里我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode
這里還配置了一個zookeeper集群,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為standby狀態
b:hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
1:hadoop分布式集群HA模式部署,七台機器跑集群:
第一台機器:namenode zkfc
第二台機器:namenode zkfc
第三台機器:resourcemanager
第四台機器:resourcemanager
第五台機器:zookeeper journalnode dataNode nodemanager
第六台機器:zookeeper journalnode dataNode nodemanager
第七台機器:zookeeper journalnode dataNode nodemanager
2:之前的博客已經搭建過Zookeeper集群了,http://www.cnblogs.com/biehongli/p/7650570.html,然后我在原來的三個虛擬機的基礎上面又加了四台虛擬機,這個時候同時跑七台虛擬機,電腦很吃力,所以自己的電腦盡可能配置要高些,這個電腦,8G內存,i5的處理器,虛擬機內存我每台虛擬機先設置512M,然后使用Xshell連接以后,將圖形化界面關閉,ctrl+alt+f7,使用命令行模式;
3:Hadoop分布式集群HA模式部署開始准備:
(1)首先,三台機器部署Zookeeper集群http://www.cnblogs.com/biehongli/p/7650570.html,之前已經部署過了,這里部署過程省略了;
(2)我的分別是centos01(master節點),centos02(slaver1節點),centos03(slaver2節點)部署的是Zookeeper集群;
centos04,centos05部署NameNode節點;
centos06,centos07部署resourcemanager節點;
然后centos01(master節點),centos02(slaver1節點),centos03(slaver2節點)增加DataNode節點;
4:首先將新加的四台虛擬機的主機名稱修改和ip對應關系修改一下:
[root@localhost hadoop]# vim /etc/sysconfig/network
5:結合前期學習和現在的搭建Hadoop分布式集群HA模式部署的准備:
(1)修改Linux主機名
(2)修改IP
(3)修改主機名和IP的映射關系(七台虛擬機都按照下面的對應關系寫):
######注意######如果你們公司是租用的服務器或是使用的雲主機(如華為用主機、阿里雲主機等);
/etc/hosts里面要配置的是內網IP地址和主機名的映射關系 ;
(4)關閉防火牆(七台虛擬機全部關閉防火牆)
[root@localhost hadoop]# service iptables stop 關閉防火牆
[root@localhost hadoop]# service iptables status 查看防火牆是否關閉
(5)ssh免登陸(免密登錄只要理解其過程,這里不再貼圖過程,過程很多,之前也貼過詳細的,http://www.cnblogs.com/biehongli/p/7640469.html):
七台虛擬機配置好了免秘鑰登錄之后,然后直接免秘鑰登錄第一次還要輸入yes很心煩,然后百度一下,下面是輸入yes的錯誤和解決辦法:
The authenticity of host 'slaver6 (192.168.3.135)' can't be established. RSA key fingerprint is cc:4e:23:01:ca:97:52:21:85:78:bc:29:ca:b3:12:52. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'slaver6' (RSA) to the list of known hosts. Last login: Thu Oct 12 22:34:41 2017 from master
解決辦法(挺好使的):
修改/etc/ssh/ssh_config文件的配置,以后則不會再出現此問題 最后面添加: StrictHostKeyChecking no UserKnownHostsFile /dev/null
驗證一下,完成了免秘鑰登錄,(需要注意的是我一直用的root權限,所以免秘鑰登錄必須使用root權限才可以):
(6)安裝JDK,配置環境變量等(由於我的機器都改成了命令行模式,所以使用命令將jdk傳到新裝的四台虛擬機上面),記得上傳之后解壓縮操作哈,我都忘記了,然后直接驗證,郁悶咋不正確呢,鬧笑話了吧:
然后配置一下jdk環境,由於我的jdk存放路徑都一樣,所以直接復制之前的文件即可(vim /etc/profile):
修改的如下所示([root@slaver3 hadoop]# source /etc/profile),修改/etc/profile文件,讓它即時生效 source /etc/profile:
修改好之后驗證一下(七台虛擬機全部驗證jdk是否安裝配置成功):
6:學習Hadoop分布式集群HA模式部署:
集群規划:
主機名 IP 安裝的軟件 運行的進程
master 192.168.3.129 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
slaver1 192.168.3.130 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
slaver2 192.168.3.131 jdk、hadoop ResourceManager
slaver3 192.168.3.132 jdk、hadoop ResourceManager
slaver4 192.168.3.133 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
slaver5 192.168.3.134 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
slaver6 192.168.3.135 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain說明:
(1)在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
(2)hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這里我們使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode,這里還配置了一個zookeeper集群,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為standby狀態
(3)hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.4.1解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
7:安裝配置zooekeeper集群(在master,slaver1,slaver2上),之前寫過,這里寫下過程,具體操作不再貼:
(1)解壓
tar -zxvf zookeeper-3.4.5.tar.gz
(2)修改配置
cd /home/hadoop/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改:dataDir=/home/hadoop/zookeeper-3.4.5/tmp
在最后添加:
server.1=master:2888:3888
server.2=slaver1:2888:3888
server.3=slaver2:2888:3888
保存退出
然后創建一個tmp文件夾
mkdir /home/hadoop/zookeeper-3.4.5/tmp
再創建一個空文件
touch /home/hadoop/zookeeper-3.4.5/tmp/myid
最后向該文件寫入ID
echo 1 > /home/hadoop/zookeeper-3.4.5/tmp/myid
(3)將配置好的zookeeper拷貝到其他節點(首先分別在slaver1、slaver2根目錄下的/home/hadoop)
scp -r /home/hadoop/zookeeper-3.4.5/ slaver1:/home/hadoop/
scp -r /home/hadoop/zookeeper-3.4.5/ slaver2:/home/hadoop/
注意:修改slaver1、slaver2對應/home/hadoop/zookeeper-3.4.5/tmp/myid內容
weekend06:
echo 2 >/home/hadoop/zookeeper-3.4.5/tmp/myid
weekend07:
echo 3 >/home/hadoop/zookeeper-3.4.5/tmp/myid
8:安裝配置hadoop集群(在slaver4上操作),首先將Hadoop的安裝包hadoop-2.4.1.tar.gz上傳到centos04上面,並且解壓縮:
[root@localhost hadoop]# tar -zxvf hadoop-2.4.1.tar.gz
配置HDFS(hadoop2.0所有的配置文件都在hadoop-2.4.1/etc/hadoop目錄下),#將hadoop添加到環境變量中,七台虛擬機都配置都配置一下hadoop的環境變量,這里在后加的四台虛擬機配置一下hadoop的環境變量,不過可以現在slaver3(centos04將hadoop配置好,直接復制到剩下的三台虛擬機上面,這樣效率最高):
修改的如下所示(貼下代碼,好復制粘貼):
export JAVA_HOME=/home/hadoop/jdk1.7.0_65 export HADOOP_HOME=/home/hadoop/hadoop-2.4.1 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
第一個配置文件:修改hadoo-env.sh(首先切換到cd /home/hadoop/hadoop-2.4.1/etc/hadoop/):
修改內容如下所示(即配置jdk的路徑):
第二個配置文件:修改core-site.xml(修改的內容如下,方便復制)
<configuration> <!-- 指定hdfs的nameservice為nameService1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1/</value> </property> <!-- 指定hadoop臨時目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/hadoop-2.4.1/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slaver1:2181,slaver2:2181</value> </property> </configuration>
修改的內容如下,方便復制:
第三個配置文件:修改hdfs-site.xml(修改的內容如下,方便復制)
<configuration> <!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有兩個NameNode,分別是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>slaver3:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>slaver3:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>slaver4:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>slaver4:50070</value> </property> <!-- 指定NameNode的元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slaver1:8485;slaver2:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/app/hadoop-2.4.1/journaldata</value> </property> <!-- 開啟NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔離機制時需要ssh免登陸 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔離機制超時時間 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
操作內容如(內容太多,分開截屏了)vim hdfs-site.xml:
第四個配置文件:修改mapred-site.xml(修改的內容如下,方便復制)
<configuration> <!-- 指定mr框架為yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
操作內容如下所示:
[root@slaver3 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@slaver3 hadoop]# vim mapred-site.xml
第五個配置文件:修改yarn-site.xml(修改的內容如下,方便復制)
<configuration> <!-- 開啟RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分別指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>slaver5</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slaver6</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>master:2181,slaver1:2181,slaver2:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
操作如下所示:
配置無密登錄ssh-keygen -t rsa,ssh-copy-id快速配置無密登錄,centos04虛擬機(即slaver3節點配置無密登錄,登錄自己,登錄master,登錄slaver1,登錄slaver2,登錄slaver4,我配置的無密登錄七台虛擬機,這點看你自己吧。);centos06虛擬機(即slaver5節點配置無密登錄,登錄自己,登錄master,登錄slaver1,登錄slaver2);
#注意:兩個namenode之間要配置ssh免密碼登陸,
第六個配置文件:修改slaves(修改的內容如下,方便復制)
注意:slaves文件就是啟動DataNode、NodeManager、一定要理解概念和含義。
修改slaves(slaves是指定子節點的位置,因為要在slaver3上啟動HDFS、在slaver5啟動yarn,所以slaver3上的slaves文件指定的是datanode的位置,slaver5上的slaves文件指定的是nodemanager的位置):
master
slaver1
slaver2
操作如下所示vim slaves:
之前,master,slaver1,slaver2配置過三台機器的集群,這里因為需要,由slaver3配置好的hadoop復制到剩余的六台機器,這里要刪除之前的集群,這里先不刪除home/hadoop/hadoop-2.4.1,先將這個名稱改了,萬一七台機器的集群搭建失敗,還可以使用三台機器的集群;
如: [root@slaver1 hadoop]# mv hadoop-2.4.1 hadoop-2.4.1-copy
將配置好的hadoop拷貝到其他節點(有虛擬機04,slaver3節點):
[root@slaver3 hadoop]# scp -r hadoop-2.4.1/ master:/home/hadoop/ [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver1:/home/hadoop/ [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver2:/home/hadoop/ [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver4:/home/hadoop/ [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver5:/home/hadoop/ [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver6:/home/hadoop/
9:配置至此已經全部結束,如果啟動出錯再回頭看,現在開始啟動:
###注意:嚴格按照下面的步驟:
9.1:啟動zookeeper集群(分別在master、slaver1、slaver2上啟動zookeeper,#查看狀態:一個leader,兩個follower):
[root@master hadoop]# cd /home/hadoop/zookeeper-3.4.5
然后啟動剩下的兩個Zookeeper節點:
然后查看一下第一個啟動的Zookeeper節點的狀態,如下所示:
9.2:啟動journalnode,為hadoop提供元數據管理(edits),第一次需要手動起,以后就不需要手動啟動了,就包含在了start-dfs.sh腳本里面了;(分別在在master、slaver1、slaver2上執行),#運行jps命令檢驗,master、slaver1、slaver2上多了JournalNode進程:
其實啟動master節點以后,slaver1節點,和slaver2節點的journalnode已經啟動起來了,可以查看一下:
如果啟動過程中有的節點沒有啟動起來,下面介紹一下如何查看日志,這點自己應該必須會吧,如hadoop沒啟動起來,就查看hadoop的日志(進入日志以后使用大G可以直接到達尾行,這樣可以直接看報啥錯誤。):
[root@master logs]# less hadoop-root-journalnode-master.log
9.3:格式化HDFS,在slaver3上執行命令:hdfs namenode -format或者./hadoop namenode -format;
#格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里我配置的是/home/hadoop/hadoop-2.4.1/tmp,然后將/home/hadoop/hadoop-2.4.1/tmp拷貝到slaver4的/home/hadoop/hadoop-2.4.1/下。
可以查看一下,創建了tmp目錄,里面的初始fsimage:
現在要保持slaver3和slaver4的fsimage初始值保持一致,即復制slaver3到slaver4:
scp -r tmp/ slaver4:/home/hadoop/app/hadoop-2.4.1/
9.4:格式化ZKFC,zkfc用來做兩個namenode的狀態切換管理或者失敗切換管理,(在slaver3上執行即可):hdfs zkfc -formatZK
格式化以后會在Zookeeper寫一些東西,現在可以看一下去(master節點):
啟動[root@master bin]# ./zkCli.sh
可以看到建立一個數據節點,叫做hadoop-ha
9.5:啟動HDFS(在slaver3上執行):sbin/start-dfs.sh或者start-dfs.sh(如果配置了hadoop的環境變量),如下圖可以很清楚的看到那個節點啟動那些進程,自己仔細分析一下,做到心中有數:
最好去看看其他節點的進程是否啟動起來,分別貼一下其他節點的進程啟動情況:
9.6:啟動YARN(#####注意#####:是在slaver5上執行start-yarn.sh,把namenode和resourcemanager分開是因為性能問題,因為他們都要占用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動): sbin/start-yarn.sh或者 start-yarn.sh(如果配置了hadoop的環境變量,source /etc/profile修改的配置文件即時生效):
接着啟動一下slaver6節點的yarn:
如下所示:start-yarn-.sh或者yarn-daemon.sh start resourcemanager
到此,hadoop-2.4.1配置完畢,可以使用瀏覽器訪問:
http://192.168.3.132:50070 NameNode 'slaver3:9000' (active) http://192.168.3.133:50070 NameNode 'slaver4:9000' (standby)
現在可以再看一下各個節點的啟動情況:
我准備用瀏覽器訪問一下的時候,瀏覽器不能訪問,我可以ping通我的192.168.3.132,郁悶了,節點都起來了,突然一想,可能是防火牆沒關,然后關了防火牆試一下,如下所示:
瀏覽器訪問如下所示(slaver3/192.168.3.132是active的;slaver4/192.168.3.133是standby的):
查看一下yarn集群管理的界面(slaver5/192.168.3.134):
當我啟動其中一個yarn的時候出現如:This is standby RM. Redirecting to the current active RM(這是備用RM。重定向到當前活動RM),
而另一個yarn就可以正常啟動:
10:驗證HDFS HA:
首先向hdfs上傳一個文件(首先查看此目錄下面是否存在數據:
cd /home/hadoop/hadoop-2.4.1/tmp/dfs/data/current/BP-1794153128-192.168.3.132-1508123872265/current/finalized):
開始上傳文件:
然后在master,slaver1,slaver2節點都可以看到block塊:
現在文件已經上傳了,可以看到集群是正常工作的,然后看看'slaver3:9000' (active)是active的,'slaver4:9000' (standby)是standby的,把slaver3干掉,看看是否正常切換:
(然后再kill掉active的NameNode):
然后看看另一個,正常的話肯定由standby變成了active:(這個時候slaver4上的NameNode變成了active)
從hdfs上面下載上傳的文件,看看能否下載,看看集群是否正常工作:
現在將那個kill掛掉的nameNode啟動起來:
通過瀏覽器訪問:http://192.168.3.132:50070,如下所示:
如果http://192.168.3.133:50070/即slaver4突然斷電,那么切換到slaver3需要等待自己配置的30s,然后自己由standby切換為active;
如果slaver3為active了,然后上傳文件的過程中,將slaver3的namenode殺掉,然后可以發現文件可以正常上傳,slaver4由standby切換為active了;
11:驗證YARN(查看yarn的狀態也不好查看,yarn的ha機制不是很好,這里測試的結果就是如果兩個resourcemanager都正常,肯定可以完成任務,如果一個死了,另一個也可以完成任務,如果把active的殺死了,任務就失敗了):
運行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
然后發現一直卡住不動了,可能是內存不夠了,master節點,slaver1節點,slaver2節點的nodemanager進程都沒了:
好吧,先不測試了:
12:測試集群工作狀態的一些指令:
bin/hdfs dfsadmin -report 查看hdfs的各節點狀態信息 bin/hdfs haadmin -getServiceState nn1 獲取一個namenode節點的HA狀態 sbin/hadoop-daemon.sh start namenode 單獨啟動一個namenode進程 ./hadoop-daemon.sh start zkfc 單獨啟動一個zkfc進程
可以hdfs的參數:
如haadmin用來管理ha的:
手動將standby切換為active:
手動將active切換為standby:
可以去瀏覽器看看slaver4的狀態,如下所示:
或者通過命令查看namenode的狀態:
學習新知識自己就像白痴一樣,學完以后發現,哦,原來又學到新知識了,是對知識的飢渴,哦,是渴望。思考可以幫助你理解。