Hadoop從入門到精通系列之--3.完全分散式環境搭建
目錄
一 什麼是完全分散式
之前3篇部落格搭建的環境都是偽分散式的環境,就是說除了我自己的電腦(win10)外,只有一臺伺服器(Linux),這在真正的生產環境下是不存在的,真正的生產環境是上百臺甚至上千臺伺服器(Linux),那麼上千臺伺服器之間如何工作呢?一個Hadoop如何在上千臺伺服器上進行工作呢?像這樣由Hadoop統一管理伺服器的形式叫做完全分散式。想要搭建這樣的一個分散式框架,至少需要3臺伺服器,我也僅以3臺伺服器為例。
二 準備伺服器
- 準備三臺安裝Linux的伺服器,可以在VMware中直接克隆,要求:關閉防火牆,靜態ip,修改主機名稱,這些在前面的部落格中都詳細介紹操作步驟。
- 安裝JDK,配置環境變數,安裝Hadoop,配置Hadoop環境變數,這裡注意每一臺伺服器上都現需要安裝JDK和Hadoop。
這裡還是總結一下:
- 關閉防火牆:chkconfig iptables off
- 設定靜態IP:vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改IP地址
- 修改主機名稱:vim /etc/sysconfig/network
三 叢集分發指令碼
什麼叫叢集分發指令碼呢?是這樣,比方說上面準備虛擬機器的時候需要安裝Hadoop,需要拷貝安裝包等,三臺伺服器還比較方便,如果是1000臺伺服器呢?可能一兩天才能把Hadoop安裝好,叢集分發指令碼就是在一臺伺服器上安裝好了之後直接使用指令碼給另外999臺伺服器發過去,方便了很多。
3.1 scp(secure copy)安全拷貝
- 使用scp可以實現伺服器和伺服器之間的安全拷貝
- 基本語法:scp -r(遞迴)$pdir/$fname(需要拷貝的資料夾或者檔名稱)
舉例:將hadoop103上的檔案/home/wanglei/people下的檔案拷貝到hadoop104上
溫馨提示:當拷貝配置檔案時,比如/etc/profile,需要source /etc/profile
3.2 rsync遠端同步
- rsync與scp表達的功能相同,但是它比scp要快,因為rsync只複製不同的檔案,而scp把所有檔案都複製過去
- 基本語法:rsync -rvl $pdir/$fname(需要拷貝的資料夾或者檔名稱)[email protected]:$pdir/$fname
舉例:將hadoop103上的檔案/home/wanglei/animal下的檔案拷貝到hadoop104上
3.3 叢集分發指令碼
上述兩種命令也僅僅只能讓兩個伺服器之間通訊,如何讓多個伺服器之間通訊呢?這就需要寫一個指令碼了,下面附上指令碼的程式碼再做解釋。
#!/bin/bash
paraCount=$#
if [ $paraCount -eq 0 ]
then
echo "沒有輸入引數"
exit
fi
p1=$1
fname=$(basename $p1)
echo "$fname"
pdir=$(cd -P $(dirname $p1);pwd)
echo "$pdir"
user=$(whoami)
echo "$user"
for ((host=104;host<105;host++))
do
echo "$host"
rsync -rvl $pdir/$fname [email protected]$host:$pdir/
echo "$pdir/$fname [email protected]$host:$pdir/"
done
-
#!/bin/bash:shell指令碼的標頭檔案標識,可以理解為c語言的標頭檔案一樣,不用理會,就是這個格式
-
paraCount=$#:$#表示獲取輸入引數的個數,$0表示命令自己本身,$1表示輸入的第一個引數,$2表示輸入的第二個引數,以此類推,但是第十個引數以上就是${10}了;$*表示命令列所有的引數並把他們當作一個整體,[email protected]表示命令列所有的引數,但是他們是分開的。
-
if [ $paraCount -eq 0 ]:if條件語句,注意中括號中的條件與中括號兩邊都有空格。
-
fname=$(basename $p1):首先$()中是linux語句表示將這條語句的執行結果賦給某個值,其次basename表示去除/前面的所有路徑,只保留最後一個
-
pdir=$(cd -P $(dirname $p1); pwd):dirname與basename恰恰相反,它的作用是保留最後一個/前的所有路徑,cd -P是獲得實體地址,也就是說從根目錄下來的地址。
-
user=$(whoami):whoami是獲取當前使用者名稱稱,並把這個結果給user
-
rsync -rvl $pdir/$fname [email protected]$host:$pdir/:根據路徑複製
具體用法:使用之前,記得給執行許可權 chmod 777 xsync1
xsync1 /home/wanglei/animal
四 叢集規劃
|
hadoop102 |
hadoop103 |
hadoop104 |
HDFS
|
NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN |
NodeManager |
ResourceManager NodeManager |
NodeManager |
4.1 規劃思想
見上表格,Hadoop叢集由NameNode、DataNode、SecondaryNameNode和ResourceManager、NodeManager組成,如何規劃他們呢?上面的表格,做一下解釋:只需要記住一點NameNode和ResourceManager不能在同一臺伺服器,因為這兩個元件都非常消耗資源。
4.2 具體配置
所有機器:core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定Hadoop執行時產生檔案的儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
hdfs-site.xml設定2nn的位置
<!-- 指定Hadoop輔助名稱節點主機配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
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>hadoop103</value>
</property>
mapred-site.xml
<!-- 指定MR執行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置結束後直接用xsync分發整個hadoop包即可
4.3 ssh免密登陸
為什麼需要ssh免密登陸呢?是為了方便群起叢集,上面雖然將叢集規劃好了,但是還是要到相應的伺服器上啟動相應的服務,不方便,使用ssh免密登陸就可以在一臺機器上啟動所有服務。
步驟:
- 生成公鑰的金鑰:ssh-keygen -t rsa
- 將公鑰拷貝至其他機器:ssh-copy-id hadoop102;ssh-copy-id hadoop103;ssh-copy-id hadoop104
- 配置slaves檔案:vim /etc/hadoop/slaves 在檔案中刪除localhost,新增hadoop102 hadoop103 hadoop104,並群發
- 啟動Hadoop,因為Hadoop分為hdfs和yarn,所以啟動也是啟動這兩個部分
- NameNode在102上,去102啟動hdfs:sbin/start-dfs.sh
- ResourceManager在103上,去103上啟動yarn:sbin/start-yarn.sh
這樣只需要啟動一次hdfs和一次yarn即可。很方便。