環境
Ubuntu18.04 LTS,也可以使用 Ubuntu20.04、Ubuntu16.04。
Hadoop 2.7.7,也適用於其他 Hadoop 2.x.y 版本。
本教程使用兩個節點作為集群環境:華為雲服務器作為 Master 節點;騰訊雲服務器作為 Slave 節點。
本文轉載自廈大數據庫實驗室的 Hadoop 集群安裝配置教程:Hadoop集群安裝配置教程_Hadoop2.6.0_Ubuntu/CentOS_廈大數據庫實驗室博客 (xmu.edu.cn)。只是對其中的配置文件稍作修改,對於在雲服務器部署Hadoop集群,這些修改時必要的。
准備工作
Hadoop 集群的安裝配置大致為如下流程:
- 選定一台機器作為 Master
- 在 Master 和其他 Slave 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
- 在 Master 節點上安裝 Hadoop,並完成配置
- 將 Master 節點上的 /usr/local/hadoop 目錄復制到其他 Slave 節點上
- 在 Master 節點上開啟 Hadoop
用到的工具:Xshell 6、WinSCP。我使用 Xshell 6 來遠程連接服務器,並使用 WinSCP 來上傳對應的軟件包到服務器。
PS:第一步 到 第四步 在 Master 和 Slave 節點上操作,而 第五步 在Master 上操作。
第一步 創建hadoop用戶
sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
sudo adduser hadoop sudo
第二步 更新apt
sudo apt-get update
sudo apt-get install vim
第三步 安裝SSH
sudo apt-get install openssh-server
第四步 安裝Java環境
先去 JDK8官網下載安裝包https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html,這里使用的版本是 jdk1.8.0_291。
sudo mkdir /usr/lib/jvm #創建 /usr/lib/jvm 目錄用來存放JDK文件
# 然后把 JDK安裝包 jdk-8u291-linux-x64.tar.gz 用 WinSCP 上傳到 /home/hadoop 目錄下,用 hadoop 用戶來登錄 WinSCP
sudo tar -zxvf /home/hadoop/jdk-8u291-linux-x64.tar.gz -C /usr/lib/jvm #把 JDK文件包解壓到 /usr/lib/jvm 目錄下
vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_291
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source ~/.bashrc
java -version
第五步 安裝 Hadoop2.7.7
將 hadoop-2.7.7.tar.gz 文件下載到 home/hadoop。下載鏈接Index of /dist/hadoop/core (apache.org)
sudo tar -zxf /home/hadoop/hadoop-2.7.7.tar.gz -C /usr/local # 解壓到 /usr/local 中
sudo mv /usr/local/hadoop-2.7.7/ /usr/local/hadoop # 將文件夾名改為 hadoop
sudo chown -R hadoop /usr/local/hadoop # 修改文件權限
檢查 Hadoop 是否可用
/usr/local/hadoop/bin/hadoop version
分布式配置
第一步 網絡配置
-
節點IP:
主節點master: 公網IP為:124.71.176.248 私網IP為:192.168.0.176 從節點slave1: 公網IP為:121.5.159.249 私網IP為:10.0.4.16
-
master的主機名為:Master slave1的主機名為:Slave1
如何修改主機名:
sudo hostnamectl set-hostname Master
-
配置 hosts,將 2 台服務器的 hosts 配置為:
sudo vim /etc/hosts
124.71.176.248 Master 192.168.0.176 Master0 121.5.159.249 Slave1 10.0.4.16 Slave01
修改后需要重啟Linux系統。
-
在各個節點上都執行如下命令。
ping Master -c 3 ping Slave1 -c 3
第二步 SSH無密碼登錄節點
必須要讓Master節點可以SSH無密碼登錄到各個Slave節點上。首先,生成Master節點的公鑰。
ssh localhost
exit
cd ~/.ssh # 如果沒有該目錄,先執行一次ssh localhost
rm ./id_rsa* # 刪除之前生成的公鑰(如果已經存在)
ssh-keygen -t rsa # 執行該命令后,遇到提示信息,一直按回車就可以
為了讓Master節點能夠無密碼SSH登錄本機,需要在Master節點上執行如下命令:
cat ./id_rsa.pub >> ./authorized_keys
完成后可以執行命令“ssh Master”來驗證一下,可能會遇到提示信息,只要輸入 yes 即可,測試成功后,請執行“exit”命令返回原來的終端。
ssh Master
exit
接下來,在Master節點將上公鑰傳輸到Slave1節點:
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
上面的命令中,scp是secure copy的簡寫,用於在 Linux下進行遠程拷貝文件。
接着在Slave1節點上,將SSH公鑰加入授權:
mkdir ~/.ssh # 如果不存在該文件夾需先創建,若已存在,則忽略本命令
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 用完以后就可以刪掉
如果有其他Slave節點,也要執行將Master公匙傳輸到Slave節點以及在Slave節點上加入授權這兩步操作。
這樣,在Master節點上就可以無密碼SSH登錄到各個Slave節點了,可在Master節點上執行如下命令進行檢驗:
ssh Slave1
exit
第三步 配置PATH變量
vim ~/.bashrc
然后,在該文件最下面的位置加入下面一行內容:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
source ~/.bashrc
第四步 配置集群/分布式環境
在配置集群/分布式模式時,需要修改“/usr/local/hadoop/etc/hadoop”目錄下的配置文件,這里僅設置正常啟動所必須的設置項,包括slaves 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml共5個文件,更多設置項可查看官方說明。
(1)修改文件slaves
需要把所有 DataNode 的主機名寫入該文件,每行一個,默認為 localhost(即把本機作為 DataNode ),所以,在偽分布式配置時,就采用了這種默認的配置,使得節點既作為 NameNode 也作為 DataNode 。在進行分布式配置時,可以保留localhost,讓Master節點同時充當 NameNode 和 DataNode ,或者也可以刪掉localhost這行,讓Master節點僅作為名稱節點使用。
本教程讓Master節點僅作為 NameNode 使用,因此將slaves文件中原來的localhost刪除,只添加如下內容:
Slave1
(2)修改文件core-site.xml
把core-site.xml文件修改為如下內容:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
(3)修改文件hdfs-site.xml
對於Hadoop的分布式文件系統HDFS而言,一般都是采用冗余存儲,冗余因子通常為3,也就是說,一份數據保存三份副本。但是,本教程只有一個Slave節點作為數據節點,即集群中只有一個數據節點,數據能保存一份,所以 ,dfs.replication的值還是設置為 1。hdfs-site.xml具體內容如下:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
(4)修改文件mapred-site.xml
“/usr/local/hadoop/etc/hadoop”目錄下有一個mapred-site.xml.template,需要修改文件名稱,把它重命名為mapred-site.xml,然后,把mapred-site.xml文件配置成如下內容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>
(5)修改文件 yarn-site.xml
把yarn-site.xml文件配置成如下內容:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
上述5個文件全部配置完成以后,需要把Master節點上的“/usr/local/hadoop”文件夾復制到各個節點上。需要首先在Master節點上執行如下命令:
cd /usr/local
sudo rm -r ./hadoop/tmp # 刪除 Hadoop 臨時文件
sudo rm -r ./hadoop/logs/* # 刪除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先壓縮再復制
cd ~
scp ./hadoop.master.tar.gz Slave1:/home/hadoop
然后在Slave1節點上執行如下命令:
sudo rm -r /usr/local/hadoop # 刪掉舊的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
同樣,如果有其他Slave節點,也要執行將hadoop.master.tar.gz傳輸到Slave節點以及在Slave節點解壓文件的操作。
先別急着啟動Hadoop集群,因為配置文件的IP的問題,需要到各個節點上修改一下配置文件。
首先是在Master上,作以下修改:
【修改文件core-site.xml】
注意這里是 Master0 而不是 Master,用私網IP而不是用公網IP。如果用 Master 會導致無法找到目的主機的錯誤,下面的配置文件也要作類似的修改。也就是說在本機服務器上配置的時候需要本機IP時填的是本機的私網IP,填其他服務器IP時填的是公網IP。
把core-site.xml文件中的 Master 改為 Master0:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master0:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
【修改文件hdfs-site.xml】
把 Master 修改為 Master0 :
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master0:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
【修改文件mapred-site.xml】
同樣把 Master 修改為 Master0:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master0:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master0:19888</value>
</property>
</configuration>
【修改文件 yarn-site.xml】
也是把 Master 修改為 Master0:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master0</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
其次是在Slave1上,作以下修改:
【修改slaves文件】
Slave01
至此,修改完畢。
首次啟動Hadoop集群時,需要先在Master節點執行名稱節點的格式化(只需要執行這一次,后面再啟動Hadoop時,不要再次格式化名稱節點),命令如下:
hdfs namenode -format
現在就可以啟動Hadoop了,啟動需要在Master節點上進行,執行如下命令:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
通過命令jps可以查看各個節點所啟動的進程。如果已經正確啟動,則在Master節點上可以看到NameNode、ResourceManager、SecondrryNameNode和JobHistoryServer進程,如下圖所示。
在Slave節點可以看到DataNode和NodeManager進程,如下圖所示。
缺少任一進程都表示出錯。另外還需要在Master節點上通過命令“hdfs dfsadmin -report”查看數據節點是否正常啟動,如果屏幕信息中的“Live datanodes”不為 0 ,則說明集群啟動成功。由於本教程有2個Slave節點充當數據節點,因此,數據節點啟動成功以后,會顯示如下圖所示信息。
hdfs dfsadmin -report
先去把服務器的需要的端口打開,本人是把全部端口打開了。我只是為了做實驗,請勿模仿我,我在全端口打開的情況下,次日便遭受了挖礦病毒。
也可以在瀏覽器中輸入地址“http://master:50070/” (master換成公網IP),通過 Web 頁面看到查看名稱節點和數據節點的狀態。如果不成功,可以通過啟動日志排查原因。
這里再次強調,偽分布式模式和分布式模式切換時需要注意以下事項:
(a)從分布式切換到偽分布式時,不要忘記修改slaves配置文件;
(b)在兩者之間切換時,若遇到無法正常啟動的情況,可以刪除所涉及節點的臨時文件夾,這樣雖然之前的數據會被刪掉,但能保證集群正確啟動。所以,如果集群以前能啟動,但后來啟動不了,特別是數據節點無法啟動,不妨試着刪除所有節點(包括Slave節點)上的“/usr/local/hadoop/tmp”文件夾,再重新執行一次hdfs namenode -format
,再次啟動即可。
第五步 執行分布式實例
執行分布式實例過程與偽分布式模式一樣,首先創建HDFS上的用戶目錄,命令如下:
hdfs dfs -mkdir -p /user/hadoop
然后,在HDFS中創建一個input目錄,並把“/usr/local/hadoop/etc/hadoop”目錄中的配置文件作為輸入文件復制到input目錄中,命令如下:
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
接着就可以運行 MapReduce 作業了,命令如下:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
運行時的輸出信息與偽分布式類似,會顯示MapReduce作業的進度,如下圖所示。
執行過程可能會有點慢,但是,如果遲遲沒有進度,比如5分鍾都沒看到進度變化,那么不妨重啟Hadoop再次測試。若重啟還不行,則很有可能是內存不足引起,建議增大虛擬機的內存,或者通過更改YARN的內存配置來解決。
在執行過程中,可以打開瀏覽器,在地址欄輸入“http://master:8088/cluster” (master換成公網IP),通過Web界面查看任務進度,在Web界面點擊 “Tracking UI” 這一列的History連接,可以看到任務的運行信息,如下圖所示。
執行完畢后的輸出結果如下圖所示。
最后,關閉Hadoop集群,需要在Master節點執行如下命令:
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver
Hadoop 3.1.3 的配置教程 請看Hadoop3.1.3安裝教程_單機/偽分布式配置_Hadoop3.1.3/Ubuntu18.04(16.04)_廈大數據庫實驗室博客 (xmu.edu.cn)
本文轉載自廈大數據庫實驗室的 Hadoop 集群安裝配置教程:Hadoop集群安裝配置教程_Hadoop2.6.0_Ubuntu/CentOS_廈大數據庫實驗室博客 (xmu.edu.cn)。