前面咱們講到了hadoop擁有3種運行模式,搭建了最簡答的本地運行模式並在其上運行了兩個簡單案例,以後搭建了僞分佈模式,並在其上運行了wordcount案例。本章節咱們學習徹底分佈式的模式。顧名思義,該模式使用多臺機器實現分佈式。node
從本章節你能夠學習到:shell
咱們準備3臺機器(分佈式最小需求),其主機文件配置以下:apache
192.168.102.133 h133 192.168.102.134 h134 192.168.102.135 h135
也就是說,咱們準備的3臺機器,主機名以h開頭,13三、134以及135分別是他們的v4地址的最後一段,方便區別。centos
主機配置文件位於/etc/hosts,修改主機名使用命令
hostname h133
bash
3臺機器都關閉防火牆
systemctl stop firewalld
。服務器
按本地運行模式的安裝方式hadoop安裝在3臺機器上,請參考本教程的2.運行環境搭建
章節。ssh
若是您使用的是xshell進行各服務器的鏈接,最好使用
工具-發送鍵到全部會話
功能,一次性配置三臺主機。分佈式
如今咱們已經在3臺機器上(h13三、h134以及h135)。在使用scp的命令過程當中,你會發現每次都要輸入節點的帳戶密碼才行,若是你安裝了ssh(必裝),每次輸入ssh訪問其餘機器的時候,也須要輸入密碼。這不只讓咱們操做起來很是麻煩,並且hadoop的一些集成腳本(如start-dfs.sh
等)沒法直接運行,須要咱們配置ssh無密碼登陸。工具
一、進入用戶的home目錄oop
# cd ~
cd ~
進入當前用戶的用戶目錄。root用戶爲/root,其餘用戶的爲/home/{$username}
二、進入.ssh
目錄,在該目錄下生成祕鑰對
# ssh-keygen -t rsa
輸入該指令後連續3次回車,即關於祕鑰對的設置都使用默認值。
三、複製祕鑰對的公鑰信息到各臺服務器上,包括本身
# ssh-copy-id h133 # ssh-copy-id h134 # ssh-copy-id h135
注意不要漏掉主機自己的配置。
如今咱們能夠從h133上直接經過命令'ssh hostname'
無祕鑰登陸到指定的主機上了。
通常狀況下,咱們只需針對一臺機器作此配置就能夠了。可是因爲咱們還會在另一臺機器上就行調度,所以,還須要在h134主機上作此配置。也就說,3臺機器裏面,咱們選定兩臺配置無祕鑰登陸。h135上的操做流程同剛纔的,繼續執行一遍便可。
.ssh目錄下默認沒有文件,當咱們第一次使用遠程登陸命令以後會生成一個名爲
known_hosts
的文件,記錄訪問的服務器信息;當咱們執行生成祕鑰對命令以後,會生成公私鑰兩個文件id_rsa
和id_rsa.pub
;噹噹前服務器接受了別的服務器的ssh-copy-id
即被複制了公鑰以後,會新生成文件authorized_keys
,該文件記錄認證了的主機及其祕鑰對的公鑰信息。
爲了咱們接下來方便進行一些操做,咱們編寫幾個輔助腳本輔助操做。
以前咱們進行遠程文件調用的時候使用的是scp命令,但要注意,scp命令顧名思義是security copy的縮寫,若目標擁有相同的文件,則會覆蓋更新。而rsync則表明同步的意思,若文件沒有修改,則不會複製,如有修改,則會更新。從這個角度上來看rsync相對比較快速一些。具體其餘的差異,可能須要具體研究。
一、安裝rsync命令工具
# yum install rsync -y
最小化安裝的centos通常沒有配備這個工具,須要咱們從鏡像倉庫拉取安裝。
二、測試遠程複製
# rsync -rvl test.txt root@h134:~
瞭解了rsync以後。
接下來咱們編寫一個腳本,內部調用rsync命令幫咱們完成一個這樣的操做:咱們只需執行命令
# xsync /目錄/.../文件
就能夠將指定的路徑同步到其餘的服務器上,這樣就省去咱們打太多命令的麻煩。在/usr/local/bin
下建立腳本文件xsync,寫入以下內容:
#!/bin/bash # 1. get param num,if 0 exit. pcount=$# if((pcount==0)); then echo no args; exit; fi # 2. get file name. p1=$1 fname=`basename $p1` echo fname=$fname # 3. get parent dir absolute path. pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir # 4. get user name. user=`whoami` # 5. loop all hosts to run command 'rsync -rvl'. for((host=133; host<=135; host++)); do echo $pdir/$fname $user@h$host:$pdir echo --------------- h$host ---------------- rsync -rvl $pdir/$fname $user@h$host:$pdir done
注意最後的循環部分,是用
h
加上133到135拼接目標主機名(拼接結果依次爲h133 h134 h135)進行循環處理的,若是您的環境不一樣,請修改腳本此處的具體內容。
三、修改腳本運行權限
chmod 777 /usr/local/bin
777是一種很暴力的受權方式,相關受權的知識推薦書籍《Linux從入門到放棄 鳥哥版》。
四、執行腳本進行測試,在任何位置建立一個文件test.txt並寫入內容,使用命令
xsync test.txt
顯然,其餘的兩臺服務器也會在相同的位置複製生成該文件。
根據前面一個腳本的經驗,咱們不妨在編寫一個腳本,能夠執行
相似xshell這類工具其實也有提供咱們多端同時輸入的功能,這裏的腳本比較簡單,參數有關路徑的必須填寫絕對路徑,不然出錯。另外,能操做的服務器只涉及集羣服務器,而不像xshell這類客戶端同樣能夠自行配置。
一、在/usr/local/bin
下建立xcall文件,並寫入以下內容
#!/bin/bash # 1.get parameter,no param wull be exit. pcount=$# if((pcount==0));then echo no args; exit; fi # 2.print localhost string. echo -------------localhost---------- # 3.run command for each host. for((host=133; host<=135; host++)); do echo ----------h$host--------- ssh h$host $@ done
能夠看到該腳本的執行原理是
ssh h1xx command
的方式執行的,也就是說,任何命令都是登陸到目標主機以後在執行的,這就會致使目錄的不一致問題,所以,咱們須要提供的路徑信息必須是絕對路徑。
二、暴力受權:
# chmod 777 xcall
三、測試腳本
[root@localhost bin]# xcall ls /opt/module/ -------------localhost---------- ----------h133--------- hadoop-2.7.2 jdk1.8.0_131 ----------h134--------- hadoop-2.7.2 jdk1.8.0_131 ----------h135--------- hadoop-2.7.2
接下來咱們規劃一下集羣的節點分配以及配置文件的設置。
咱們按照下表所列的節點分配來規劃咱們的集羣 ||DataNode|NameNode|SecondaryNameNode|NodeManager|ResourceManager| |:-:|:-:|:-:|:-:|:-:|:-:| |h133|√|√||√|| |h134|√|||√|√| |h135|√||√|√||
也就是說,三臺機都是DataNode節點,h133用做名稱節點,h135用做輔助名稱節點,h133和h135用做節點管理節點,h134用做資源管理節點。
NodeNode、SecondaryNameNode以及ResourceManager是比較耗費服務器資源的,所以咱們將他們分別放在三臺服務器上。
選定服務器h133,在其上進行文件配置,以後咱們再從h133上將配置文件推送到其餘的集羣服務就能夠實現配置文件的同步了。
全部的配置文件都位於/opt/module/hadoop-2.7.2/etc/hadoop/下。如下配置是針對個人環境進行配置的,注意一些配置的值須要和你的環境保持對應。
一、core-site.xml
:
<!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://h133:8020</value> </property> <!-- 指定hadoop運行時產生文件的存儲目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property>
二、配置HDFS
咱們先來配置HDFS組件相關的配置信息。
(1)hadoop-env.sh
:
export JAVA_HOME=/opt/module/jdk1.8.0_131
(2)hdfs-site.xml
:
<configuration> <!-- 指定數據節點存儲副本數,默認是3,所以可不配置--> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- 指定SecondaryNameNode地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>h135:50090</value> </property> </configuration>
(3)配置slaves服務節點,也就是數據節點(datanode)的主機名稱,咱們前面提到過,要將全部機器都做爲datanode。修改slaves
文件,加入以下內容:
h133 h134 h135
slaves文件的默認內容爲localhost,咱們修改其爲集羣全部節點。salve文件一樣位於
/opt/module/hadoop-2.7.2/etc/hadoop
下。
四、配置YARN
接下來咱們接着配置YARN組件相關的配置信息。
(1)yarn-env.sh
:
export JAVA_HOME=/opt/module/jdk1.8.0_131
(2)yarn-site.xml
:
<!-- reducer獲取數據的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>h134</value> </property>
五、配置MapReduce
最後咱們配置MapReduce組件
(1)mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_131
(2)使用mapred-site.xml.tempalte模板,修改其名字爲:mapred-site.xml
,添加以下配置:
<!-- 指定mr運行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
接下來,咱們的配置工做就在一臺機器上完成了。這樣的操做咱們還須要從其餘集羣機器上再來一次,不過沒必要那麼麻煩,直接使用咱們前面的xsync腳本就能夠了。
在此以前,請再一次檢查你的配置文件是否有遺漏、勘誤——這是個細心活。
六、分發配置文件 來到hadoop配置文件上一級,將hadoop文件夾總體分發到集羣的全部節點便可完成配置文件的同步。
# cd /opt/module/hadoop-2.7.2/etc/ # xsync hadoop
執行命令後您能夠在其餘服務器上查看配置文件是否成功同步。
前面咱們啓動集羣的時候是一個節點一個節點的啓動的,如今咱們使用集成腳原本啓動集羣。
格式化NameNode的時候請在namenode所在的節點上執行操做。
若是NameNode和ResourceManager不在同一臺機器上,例如咱們如今的例子。不能在NameNode上啓動Yarn,應該在ResourceManager指定的服務器上啓動Yarn。
一、到namenode所在服務器,即h133上格式化NameNode。
[h133]# hdfs namenode -format
二、h133上啓動dfs組件
(1)調用dfs集成腳本啓動
[h133]# start-dfs.sh
(2)查看節點啓動狀況
[h133]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h133--------- 2227 NameNode 2347 DataNode 2575 Jps ----------h134--------- 2513 DataNode 2607 Jps ----------h135--------- 2168 Jps 2009 DataNode 2073 SecondaryNameNode
若是你的環境輸出和這個不一致,例如h133上沒有發現有NM DN節點,則說明有問題,請查看本身哪一步出現問題了。
四、h134上啓動yarn組件
注意,啓動dfs組件在h133。而如今,咱們切換到h134,即ResourceManager所在的服務器上執行yarn組件的啓動。
(1)調用yarn集成腳本啓動組件
[h134] start-yarn.sh
(2)查看啓動狀況
[h134 ]# xcall $JAVA_HOME/bin/jps -------------localhost---------- ----------h133--------- 2721 Jps 2227 NameNode 2615 NodeManager 2347 DataNode ----------h134--------- 2656 ResourceManager 2513 DataNode 2754 NodeManager 3055 Jps ----------h135--------- 2320 Jps 2211 NodeManager 2009 DataNode 2073 SecondaryNameNode
若是您的進程開啓狀況和這個一致,恭喜你,集羣搭建成功了!。
若是中間過程出錯了,要回退到初始狀態,只須要中止全部的集羣節點
sbin/stop-xxx.sh
,而後刪除各服務器的{HADOOP_HOME}/data
以及{HADOOP_HOME}/logs
以後。盤查完問題在從頭來過。