1. 程式人生 > >Hadoop叢集搭建以及遇到問題詳解

Hadoop叢集搭建以及遇到問題詳解

轉載:http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/

centos7單機、分散式、偽分佈:https://blog.csdn.net/qq_40938267/article/details/83416665  有詳細的搭建過程

環境

本教程使用 Ubuntu 14.04 64位 作為系統環境,基於原生 Hadoop 2,在 Hadoop 2.6.0 (stable) 版本下驗證通過,可適合任何 Hadoop 2.x.y 版本,例如 Hadoop 2.7.1,Hadoop 2.4.1 等。

本教程簡單的使用兩個節點作為叢集環境: 一個作為 Master 節點,區域網 IP 為 192.168.1.121;另一個作為 Slave 節點,區域網 IP 為 192.168.1.122。

準備工作

Hadoop 叢集的安裝配置大致為如下流程:

  1. 選定一臺機器作為 Master
  2. 在 Master 節點上配置 hadoop 使用者、安裝 SSH server、安裝 Java 環境
  3. 在 Master 節點上安裝 Hadoop,並完成配置
  4. 在其他 Slave 節點上配置 hadoop 使用者、安裝 SSH server、安裝 Java 環境
  5. 將 Master 節點上的 /usr/local/hadoop 目錄複製到其他 Slave 節點上

兩臺虛擬機器之間複製檔案 (在主虛擬機器執行)scp ~/.ssh/id_rsa.pub  IP(目標虛擬機器):/home/hadoop/

  1. 在 Master 節點上開啟 Hadoop

配置 hadoop 使用者、安裝 SSH server、安裝 Java 環境、安裝 Hadoop 等過程已經在Hadoop安裝教程_單機/偽分散式配置CentOS安裝Hadoop_單機/偽分散式配置中有詳細介紹,請前往檢視,不再重複敘述。

繼續下一步配置前,請先完成上述流程的前 4 個步驟。

網路配置

假設叢集所用的節點都位於同一個區域網。

如果使用的是虛擬機器安裝的系統,那麼需要更改網路連線方式為橋接(Bridge)模式,才能實現多個節點互連,例如在 VirturalBox 中的設定如下圖。此外,如果節點的系統是在虛擬機器中直接複製的,要確保各個節點的 Mac 地址不同(可以點右邊的按鈕隨機生成 MAC 地址,否則 IP 會衝突):

VirturalBox中節點的網路設定

Linux 中檢視節點 IP 地址的命令為 ifconfig,即下圖所示的 inet 地址(注意虛擬機器安裝的 CentoS 不會自動聯網,需要點右上角連上網路才能看到 IP 地址):

Linux檢視IP命令

首先在 Master 節點上完成準備工作,並關閉 Hadoop (/usr/local/hadoop/sbin/stop-dfs.sh),再進行後續叢集配置。

為了便於區分,可以修改各個節點的主機名(在終端標題、命令列中可以看到主機名,以便區分)。在 Ubuntu/CentOS 7 中,我們在 Master 節點上執行如下命令修改主機名(即改為 Master,注意是區分大小寫的):

  1. sudo vim /etc/hostname

Shell 命令

如果是用 CentOS 6.x 系統,則是修改 /etc/sysconfig/network 檔案,改為 HOSTNAME=Master,如下圖所示:

CentOS中hostname設定

然後執行如下命令修改自己所用節點的IP對映:

  1. sudo vim /etc/hosts

Shell 命令

例如本教程使用兩個節點的名稱與對應的 IP 關係如下:

192.168.1.121   Master

192.168.1.122   Slave1

我們在 /etc/hosts 中將該對映關係填寫上去即可,如下圖所示(一般該檔案中只有一個 127.0.0.1,其對應名為 localhost,如果有多餘的應刪除,特別是不能有 “127.0.0.1 Master” 這樣的記錄):

Hadoop中的hosts設定

CentOS 中的 /etc/hosts 配置則如下圖所示:

CentOS中的hosts設定

修改完成後需要重啟一下,重啟後在終端中才會看到機器名的變化。接下來的教程中請注意區分 Master 節點與 Slave 節點的操作。

需要在所有節點上完成網路配置

。如上面講的是 Master 節點的配置,而在其他的 Slave 節點上,也要對 /etc/hostname(修改為 Slave1、Slave2 等) 和 /etc/hosts(跟 Master 的配置一樣)這兩個檔案進行修改!

配置好後需要在各個節點上執行如下命令,測試是否相互 ping 得通,如果 ping 不通,後面就無法順利配置成功:

  1. ping Master -c 3   # ping 3次,否則要按 Ctrl+c 中斷
  2. ping Slave1 -c 3

Shell 命令

例如我在 Master 節點上 ping Slave1,ping 通的話會顯示 time,顯示的結果如下圖所示:

檢查是否ping得通

繼續下一步配置前,請先完成所有節點的網路配置,修改過主機名的話需重啟才能生效。

SSH無密碼登陸節點

這個操作是要讓 Master 節點可以無密碼 SSH 登陸到各個 Slave 節點上。

首先生成 Master 節點的公匙,在 Master 節點的終端中執行(因為改過主機名,所以還需要刪掉原有的再重新生成一次):

  1. cd ~/.ssh               # 如果沒有該目錄,先執行一次ssh localhost
  2. rm ./id_rsa*            # 刪除之前生成的公匙(如果有)
  3. ssh-keygen -t rsa       # 一直按回車就可以

Shell 命令

讓 Master 節點需能無密碼 SSH 本機,在 Master 節點上執行:

  1. cat ./id_rsa.pub >> ./authorized_keys

Shell 命令

完成後可執行 ssh Master 驗證一下(可能需要輸入 yes,成功後執行 exit 返回原來的終端)。接著在 Master 節點將上公匙傳輸到 Slave1 節點:

  1. scp ~/.ssh/id_rsa.pub [email protected]:/home/hadoop/

Shell 命令

scp 是 secure copy 的簡寫,用於在 Linux 下進行遠端拷貝檔案,類似於 cp 命令,不過 cp 只能在本機中拷貝。執行 scp 時會要求輸入 Slave1 上 hadoop 使用者的密碼(hadoop),輸入完成後會提示傳輸完畢,如下圖所示:

通過scp向遠端主機拷貝檔案

接著在 Slave1 節點上,將 ssh 公匙加入授權:

  1. mkdir ~/.ssh       # 如果不存在該資料夾需先建立,若已存在則忽略
  2. cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
  3. rm ~/id_rsa.pub    # 用完就可以刪掉了

cat id_rsa.pub >> ~/.ssh/authorized_keys 到id_rsa.pub被複制的根目錄下執行

 

Shell 命令

如果有其他 Slave 節點,也要執行將 Master 公匙傳輸到 Slave 節點、在 Slave 節點上加入授權這兩步。

這樣,在 Master 節點上就可以無密碼 SSH 到各個 Slave 節點了,可在 Master 節點上執行如下命令進行檢驗,如下圖所示:

  1. ssh Slave1

Shell 命令

在Master節點中ssh到Slave節點

配置PATH變數

(CentOS 單機配置 Hadoop 的教程中有配置這一項了,這一步可以跳過)

在單機偽分散式配置教程的最後,說到可以將 Hadoop 安裝目錄加入 PATH 變數中,這樣就可以在任意目錄中直接使用 hadoo、hdfs 等命令了,如果還沒有配置的,需要在 Master 節點上進行配置。首先執行 vim ~/.bashrc,加入一行:

export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

如下圖所示:

配置PATH變數

儲存後執行 source ~/.bashrc 使配置生效。

配置叢集/分散式環境

叢集/分散式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5個配置檔案,更多設定項可點選檢視官方說明,這裡僅設定了正常啟動所必須的設定項: slaves、core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml

1, 檔案 slaves,將作為 DataNode 的主機名寫入該檔案,每行一個,預設為 localhost,所以在偽分散式配置時,節點即作為 NameNode 也作為 DataNode。分散式配置可以保留 localhost,也可以刪掉,讓 Master 節點僅作為 NameNode 使用。

slaves:在/usr/local/hadoop/etc/hadoop 中 然後vim slaves  將localhost改為slave1 (其他節點名)

本教程讓 Master 節點僅作為 NameNode 使用,因此將檔案中原來的 localhost 刪除,只新增一行內容:Slave1。

2, 檔案 core-site.xml 改為下面的配置:

  1. <configuration>
  2.         <property>
  3.                 <name>fs.defaultFS</name>
  4.                 <value>hdfs://Master:9000</value>
  5.         </property>
  6.         <property>
  7.                 <name>hadoop.tmp.dir</name>
  8.                 <value>file:/usr/local/hadoop/tmp</value>
  9.                 <description>Abase for other temporary directories.</description>
  10.         </property>
  11. </configuration>

XML

3, 檔案 hdfs-site.xml,dfs.replication 一般設為 3,但我們只有一個 Slave 節點,所以 dfs.replication 的值還是設為 1:

  1. <configuration>
  2.         <property>
  3.                 <name>dfs.namenode.secondary.http-address</name>
  4.                 <value>Master:50090</value>
  5.         </property>
  6.         <property>
  7.                 <name>dfs.replication</name>
  8.                 <value>1</value>
  9.         </property>
  10.         <property>
  11.                 <name>dfs.namenode.name.dir</name>
  12.                 <value>file:/usr/local/hadoop/tmp/dfs/name</value>
  13.         </property>
  14.         <property>
  15.                 <name>dfs.datanode.data.dir</name>
  16.                 <value>file:/usr/local/hadoop/tmp/dfs/data</value>
  17.         </property>
  18. </configuration>

XML

4, 檔案 mapred-site.xml (可能需要先重新命名,預設檔名為 mapred-site.xml.template),然後配置修改如下:

  1. <configuration>
  2.         <property>
  3.                 <name>mapreduce.framework.name</name>
  4.                 <value>yarn</value>
  5.         </property>
  6.         <property>
  7.                 <name>mapreduce.jobhistory.address</name>
  8.                 <value>Master:10020</value>
  9.         </property>
  10.         <property>
  11.                 <name>mapreduce.jobhistory.webapp.address</name>
  12.                 <value>Master:19888</value>
  13.         </property>
  14. </configuration>

XML

5, 檔案 yarn-site.xml:

  1. <configuration>
  2.         <property>
  3.                 <name>yarn.resourcemanager.hostname</name>
  4.                 <value>Master</value>
  5.         </property>
  6.         <property>
  7.                 <name>yarn.nodemanager.aux-services</name>
  8.                 <value>mapreduce_shuffle</value>
  9.         </property>
  10. </configuration>

XML

配置好後,將 Master 上的 /usr/local/Hadoop 資料夾複製到各個節點上。因為之前有跑過偽分散式模式,建議在切換到叢集模式前先刪除之前的臨時檔案。在 Master 節點上執行:

  1. cd /usr/local
  2. sudo rm -r ./hadoop/tmp     # 刪除 Hadoop 臨時檔案
  3. sudo rm -r ./hadoop/logs/*   # 刪除日誌檔案
  4. tar -zcf ~/hadoop.master.tar.gz ./hadoop   # 先壓縮再複製
  5. cd ~
  6. scp ./hadoop.master.tar.gz Slave1:/home/hadoop

Shell 命令

在 Slave1 節點上執行:

  1. sudo rm -r /usr/local/hadoop    # 刪掉舊的(如果存在)
  2. sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
  3. sudo chown -R hadoop /usr/local/hadoop

Shell 命令

同樣,如果有其他 Slave 節點,也要執行將 hadoop.master.tar.gz 傳輸到 Slave 節點、在 Slave 節點解壓檔案的操作。

首次啟動需要先在 Master 節點執行 NameNode 的格式化:

  1. hdfs namenode -format       # 首次執行需要執行初始化,之後不需要

Shell 命令

CentOS系統需要關閉防火牆

CentOS系統預設開啟了防火牆,在開啟 Hadoop 叢集之前,需要關閉叢集中每個節點的防火牆。有防火牆會導致 ping 得通但 telnet 埠不通,從而導致 DataNode 啟動了,但 Live datanodes 為 0 的情況。

在 CentOS 6.x 中,可以通過如下命令關閉防火牆:

  1. sudo service iptables stop   # 關閉防火牆服務
  2. sudo chkconfig iptables off  # 禁止防火牆開機自啟,就不用手動關閉了

Shell 命令

若用是 CentOS 7,需通過如下命令關閉(防火牆服務改成了 firewall):

  1. systemctl stop firewalld.service    # 關閉firewall
  2. systemctl disable firewalld.service # 禁止firewall開機啟動

Shell 命令

如下圖,是在 CentOS 6.x 中關閉防火牆:

CentOS6.x系統關閉防火牆

接著可以啟動 hadoop 了,啟動需要在 Master 節點上進行:

  1. start-dfs.sh
  2. start-yarn.sh
  3. mr-jobhistory-daemon.sh start historyserver

 

這個指令碼的服務是實現web檢視作業的歷史執行情況。有些情況下,作業執行完了,在web端就無法檢視執行情況。

可以通過開啟這個的守護程序來達到檢視歷史任務。

啟動命令為

   mr-jobhistory-daemon.sh start historyserver

 

Shell 命令

通過命令 jps 可以檢視各個節點所啟動的程序。正確的話,在 Master 節點上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 程序,如下圖所示:

通過jps檢視Master的Hadoop程序

在 Slave 節點可以看到 DataNode 和 NodeManager 程序,如下圖所示:

通過jps檢視Slave的Hadoop程序

缺少任一程序都表示出錯。另外還需要在 Master 節點上通過命令 hdfs dfsadmin -report 檢視 DataNode 是否正常啟動,如果 Live datanodes 不為 0 ,則說明叢集啟動成功。例如我這邊一共有 1 個 Datanodes:

通過dfsadmin檢視DataNode的狀態

也可以通過 Web 頁面看到檢視 DataNode 和 NameNode 的狀態:http://master:50070/。如果不成功,可以通過啟動日誌排查原因。

偽分散式、分散式配置切換時的注意事項

1, 從分散式切換到偽分散式時,不要忘記修改 slaves 配置檔案;
2, 在兩者之間切換時,若遇到無法正常啟動的情況,可以刪除所涉及節點的臨時資料夾,這樣雖然之前的資料會被刪掉,但能保證叢集正確啟動。所以如果叢集以前能啟動,但後來啟動不了,特別是 DataNode 無法啟動,不妨試著刪除所有節點(包括 Slave 節點)上的 /usr/local/hadoop/tmp 資料夾,再重新執行一次 hdfs namenode -format,再次啟動試試。

執行分散式例項

執行分散式例項過程與偽分散式模式一樣,首先建立 HDFS 上的使用者目錄:

  1. hdfs dfs -mkdir -p /user/hadoop

Shell 命令

將 /usr/local/hadoop/etc/hadoop 中的配置檔案作為輸入檔案複製到分散式檔案系統中:

  1. hdfs dfs -mkdir input
  2. hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input

 

hdfs dfs -mkdir -p /user/hadoop

hdfs dfs -mkdir input不成功的話給input加絕對路徑/user/hadoop/input

hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input 也一樣/user/hadoop/input

Shell 命令

通過檢視 DataNode 的狀態(佔用大小有改變),輸入檔案確實複製到了 DataNode 中,如下圖所示:

通過Web頁面檢視DataNode的狀態

接著就可以執行 MapReduce 作業了:

  1. hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

出錯了執行這句:

Hadoop jar

/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input output 'dfs[a-z.]+'    

Shell 命令

執行時的輸出資訊與偽分散式類似,會顯示 Job 的進度。

可能會有點慢,但如果遲遲沒有進度,比如 5 分鐘都沒看到進度,那不妨重啟 Hadoop 再試試。若重啟還不行,則很有可能是記憶體不足引起,建議增大虛擬機器的記憶體,或者通過更改 YARN 的記憶體配置解決。

顯示MapReduce Job的進度

同樣可以通過 Web 介面檢視任務進度 http://master:8088/cluster,在 Web 介面點選 “Tracking UI” 這一列的 History 連線,可以看到任務的執行資訊,如下圖所示:

通過Web頁面檢視叢集和MapReduce作業的資訊

執行完畢後的輸出結果:

MapReduce作業的輸出結果

關閉 Hadoop 叢集也是在 Master 節點上執行的:

  1. stop-yarn.sh
  2. stop-dfs.sh
  3. mr-jobhistory-daemon.sh stop historyserver

Shell 命令

此外,同偽分散式一樣,也可以不啟動 YARN,但要記得改掉 mapred-site.xml 的檔名。

自此,你就掌握了 Hadoop 的叢集搭建與基本使用了。