搭建Hadoop叢集
寫在前面
按照老師的要求,來學習大資料了。大資料中hadoop體系佔據著很大一部分,要學習hadoop相關內容就要先搭建好他的叢集。這裡就記錄一下如何搭建一個hadoop叢集。
前期準備
- 三臺虛擬機器(關閉了防火牆,設定好了靜態ip,mac地址和主機名稱,安裝了JDK和hadoop,並設定了環境變數),如下圖:
下面演示一下如何配置一臺主機,剩下兩臺直接克隆(Vmware軟體裡右鍵虛擬機器管理裡有克隆,選擇完整克隆)即可。這裡使用的是centos7系統。
-
關閉防火牆
在終端介面輸入命令
systemctl status firewalld.service
檢視防火牆狀態,active(running)代表正在執行。
輸入命令
systemctl stop firewalld.service
來停止防火牆,再使用上面的命令檢視是否關閉。如果出現disactive(dead)則表示已關閉。
輸入命令
systemctl disable firewalld.service
來將防火牆的開機自啟關閉,永久關閉防火牆。
-
修改主機名
見該文章:centos7修改主機名 並且按照教程來配置好主機名和ip的對映(linux裡的hosts檔案和windows裡的hosts檔案),方便日後使用。在設定完後可以在命令列用主機名ping測試一下:
-
建立自己的使用者賬號,並賦予root許可權:
在安裝centos7時就會讓你建立一個自己的賬號,只需要讓它具有root許可權即可。
修改/etc/sudoers檔案,找到如下圖的地方:
在root使用者下面一行新增你的使用者賬號,按照上面的格式寫就行。
-
在/opt目錄下建立module和software資料夾:
sudo mkdir module sudo mkdir software
修改module和software的所有者cd
sudo chown liuge:liuge module/ software/
這裡的liuge是我自己的使用者,設定成你自己的就行。
-
安裝JDK和hadoop
檢視是否安裝java軟體:
rpm -qa | grep java
如果安裝版本低於1.8,解除安裝它:
sudo rpm -e 軟體包
用ssh軟體將jdk和hadoop的gz包傳到/opt/software下,這裡我用的是MobaXterm
這裡使用的是jdk1.8和hadoop2.7.2的版本。
將jdk解壓到/opt/module下:
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /opt/module/
也把hadoop解壓到opt/module/下:
tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
接下來配置環境變數。
我們首先獲取到jdk的路徑和hadoop的路徑:
[liuge@hadoop03 jdk1.8.0_202]$ pwd /opt/module/jdk1.8.0_202 [liuge@hadoop03 hadoop-2.7.2]$ pwd /opt/module/hadoop-2.7.2
用vim編輯/etc/profile檔案:
sudo vim /etc/profile
在profile檔案的末尾新增JDK和hadoop路徑:
#JAVA_HOME export JAVA_HOME=/opt/module/jdk1.8.0_202 export PATH=$PATH:$JAVA_HOME/bin ##HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop-2.7.2 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
儲存後退出(esc :wq)。
讓修改後的檔案生效:
source /etc/profile
檢視是否配置完成:
java -version hadoop version
如果有版本資訊出現,則說明配置完成了。
-
設定mac地址和靜態IP
當克隆出新的主機後,先不要開啟,用Vmware開啟該虛擬機器設定,網路介面卡,高階,重新生成一個mac地址。
設定靜態IP,直接通過圖形化介面操作即可。
-
為了方便日後使用,我們編寫一個指令碼用來叢集分發各種配置檔案等等。
在/home/liuge 目錄下建立bin目錄,並在bin目錄下建立xsync檔案。這裡的路徑就是你的使用者home。在裡面寫入如下內容:
#!/bin/bash #1 獲取輸入引數個數,如果沒有引數,直接退出 pcount=$# if((pcount==0)); then echo no args; exit; fi #2 獲取檔名稱 p1=$1 fname=`basename $p1` echo fname=$fname #3 獲取上級目錄到絕對路徑 pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir #4 獲取當前使用者名稱稱 user=`whoami` #5 迴圈 for((host=3; host<6; host++)); do echo ------------------- hadoop$host -------------- rsync -rvl $pdir/$fname $user@hadoop0$host:$pdir done
這裡的迴圈程式碼裡的條件要換成你自己的虛擬機器名稱。
修改指令碼xsync具有執行許可權:
chmod 777 xsync
要使用指令碼,直接xsync+檔名稱即可:
xsync /home/liuge/bin
-
配置ssh無密登入
我們進入第一臺主機(hadoop03)的/home/liuge/.ssh目錄下,生成公鑰和私鑰:
ssh-keygen -t rsa
如果沒有這個目錄,就先用ssh命令連線一下別的主機。
然後將公鑰拷貝到免密登入的機子上:
ssh-copy-id hadoop03 ssh-copy-id hadoop04 ssh-copy-id hadoop05
按照這個操作,我們再在hadoop03上用root賬號配置一下免密登入到hadoop03、04、05。並且在hadoop04上用liuge賬號(自己的賬號)配置一下hadoop04免密登入到hadoop03、hadoop04、hadoop05上。
叢集配置
首先我們要規劃好如何分配:
hadoop03 | hadoop04 | hadoop05 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | NodeManager | ResourceManager NodeManger | NodeManager |
接下來開始設定配置檔案。
注意,配置xml時要把property標籤都放在configuration標籤裡,如圖
core-site.xml
在/opt/module/hadoop-2.7.2/etc/hadoop 下,開啟core-site.xml檔案,新增如下內容:
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop03:9000</value>
</property>
<!-- 指定Hadoop執行時產生檔案的儲存目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
hadoop-env.sh
還是在當前目錄下,開啟hadoop-env.sh,配置JAVA_HOME:
export JAVA_HOME=/opt/module/jdk1.8.0_202
hdfs-site.xml
依然是當前目錄,開啟hdfs-site.xml檔案,新增如下內容:
<!-- 指定Hadoop輔助名稱節點主機配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop05:50090</value>
</property>
yarn-env.sh
當前目錄,開啟yarn-env.sh,新增JAVA_HOME:
export JAVA_HOME=/opt/module/jdk1.8.0_202
yarn-site.xml
當前目錄,開啟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>hadoop04</value>
</property>
mapred-env.sh
當前目錄,開啟mapred-env.sh,配置JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_202
mapred-site.xml
當前目錄,將mapred-site.xml.template改名為mapred-site.xml,並開啟:
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
新增如下配置檔案:
<!-- 指定MR執行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置slaves
當前目錄下,開啟slaves檔案,加入如下內容:
hadoop03
hadoop04
hadoop05
這裡寫好自己的叢集名稱(這裡需要前面配置了對映,如果沒配置請往上翻),同時這個檔案不允許有空格或者空行。
分發配置檔案
運用我們剛才寫的xsync指令碼,將配置檔案分發:
xsync /opt/module/hadoop-2.7.2/
啟動叢集
我們在hadoop03(配置了NameNode)的機子上,在/opt/module/hadoop-2.7.2目錄下,輸入以下命令啟動HDFS:
sbin/start-dfs.sh
同理,可以使用stop-dfs.sh來停止HDFS:
sbin/stop-dfs.sh
在hadoop04(配置了ResourceManager)的機子上,在/opt/module/hadoop-2.7.2目錄,輸入以下命令啟動yarn:
sbin/start-yarn.sh
同理,停止:
sbin/stop-yarn.sh
網頁測試
在web端進行測試,看看是否啟動了。比如hadoop03:50070(我這裡是在windows設定了對映,實際還是ip地址),開啟HDFS的管理介面。
可以使用hadoop05:50090開啟SecondNameNode的介面。
如果打不開,請按照上面的流程再檢查一遍。
總結
總的來說,搭建一個hadoop叢集還是不容易的。不過如果配置完一次,下一次直接啟動就好了。還是比較方便的。