【hadoop】5.徹底分佈式模式

簡介

前面咱們講到了hadoop擁有3種運行模式,搭建了最簡答的本地運行模式並在其上運行了兩個簡單案例,以後搭建了僞分佈模式,並在其上運行了wordcount案例。本章節咱們學習徹底分佈式的模式。顧名思義,該模式使用多臺機器實現分佈式。node

從本章節你能夠學習到:shell

  1. hadoop的徹底分佈式模式的搭建;
  2. 在徹底分佈式模式下運行wordcount案例;
  3. 編寫腳本實現一鍵多臺服務器文件同步;
  4. 編寫腳本實現一條命令多條服務器同步執行;

一、準備環境

咱們準備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 h133bash

3臺機器都關閉防火牆systemctl stop firewalld服務器

按本地運行模式的安裝方式hadoop安裝在3臺機器上,請參考本教程的2.運行環境搭建章節。ssh

若是您使用的是xshell進行各服務器的鏈接,最好使用工具-發送鍵到全部會話功能,一次性配置三臺主機。分佈式

二、準備工做:配置SSH無祕鑰登陸

如今咱們已經在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_rsaid_rsa.pub;噹噹前服務器接受了別的服務器的ssh-copy-id即被複制了公鑰以後,會新生成文件authorized_keys,該文件記錄認證了的主機及其祕鑰對的公鑰信息。

三、準備工做:編寫集羣輔助腳本

爲了咱們接下來方便進行一些操做,咱們編寫幾個輔助腳本輔助操做。

3.一、編寫xsync腳本

以前咱們進行遠程文件調用的時候使用的是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

顯然,其餘的兩臺服務器也會在相同的位置複製生成該文件。

3.二、編寫xcall腳本

根據前面一個腳本的經驗,咱們不妨在編寫一個腳本,能夠執行

相似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

四、集羣規劃及配置

接下來咱們規劃一下集羣的節點分配以及配置文件的設置。

4.一、集羣規劃

咱們按照下表所列的節點分配來規劃咱們的集羣 ||DataNode|NameNode|SecondaryNameNode|NodeManager|ResourceManager| |:-:|:-:|:-:|:-:|:-:|:-:| |h133|√|√||√|| |h134|√|||√|√| |h135|√||√|√||

也就是說,三臺機都是DataNode節點,h133用做名稱節點,h135用做輔助名稱節點,h133和h135用做節點管理節點,h134用做資源管理節點。

NodeNode、SecondaryNameNode以及ResourceManager是比較耗費服務器資源的,所以咱們將他們分別放在三臺服務器上。

4.二、配置文件

選定服務器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以後。盤查完問題在從頭來過。

參考

  1. 官方網站:http://hadoop.apache.org/
  2. 官方文檔:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.2/
  3. 官方文檔:http://hadoop.apache.org/docs/r2.7.2/
  4. 書籍《hadoop權威指南 第四版》
相關文章
相關標籤/搜索