前提
這篇文章是基於Linux
系統CentOS7
搭建Hadoop-3.3.0
分散式叢集的詳細手記。
基本概念
Hadoop
中的HDFS
和YARN
都是主從架構,主從架構會有一主多從和多主多從兩種架構,這裡為了簡化搭建叢集的流程,這裡使用一主多從的架構。Hadoop
叢集中各個角色的名稱如下:
服務 | 主節點 | 從節點 |
---|---|---|
HDFS |
NameNode |
DataNode |
YARN |
ResourceManager |
NodeManager |
還有SecondaryNameNode,其實是NameNode的備用節點,定時合併和處理日誌並且反饋到NameNode上。一般NameNode和SecondaryNameNode儘量不要放在同一個節點。
HDFS
服務和YARN
其實是分離的,一者是資料儲存,另一者是資源排程,Hadoop
叢集可以只啟用YARN
叢集做資源排程。
測試叢集伺服器規劃
測試的Hadoop
叢集使用了3
臺基於VirtualBox
搭建的CentOS7
虛擬機器:
內網IP | 主機名 | 使用者 | 虛擬磁碟空間 | HDFS角色 | YARN角色 |
---|---|---|---|---|---|
192.168.56.200 |
hadoop01 |
hadoop |
30GB |
NameNode 、DataNode |
NodeManager |
192.168.56.201 |
hadoop02 |
hadoop |
30GB |
DataNode |
NodeManager |
192.168.56.202 |
hadoop03 |
hadoop |
30GB |
SecondaryNameNode 、DataNode |
ResourceManager 、NodeManager |
前置軟體安裝或者準備工作
主要包括必要的軟體安裝、使用者建立和網路配置等等。
關閉防火牆
為了避免出現部分埠無法訪問,內網環境下每臺虛擬機器都可以直接關閉防火牆:
# 停止防火牆程式
systemctl stop firewalld.service
# 禁用防火牆開機啟動
systemctl disable firewalld.service
JDK安裝
JDK
的安裝比較簡單,這裡過程略過。筆者使用的JDK
是OpenJDK
,版本是1.8.0_252-b09
,JDK
路徑配置如下:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
export PATH=$JAVA_HOME/bin:$PATH
確保叢集所有機器的JDK
安裝位置相同,並且JDK
版本儘可能大版本選擇8
,經過大量測試發現Hadoop
暫時不相容JDK9+
。
[root@localhost]# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
這個JDK安裝位置和安裝包名稱是不是看起來比較奇怪?沒錯,是筆者偷懶用yum直接安裝的OpenJDK。
修改主機名
三個節點分別通過hostnamectl set-hostname $hostname
修改主機名:
# 節點192.168.56.200
hostnamectl set-hostname hadoop01
reboot
# 節點192.168.56.201
hostnamectl set-hostname hadoop02
reboot
# 節點192.168.56.202
hostnamectl set-hostname hadoop03
reboot
最終效果如下:
Connecting to 192.168.56.200:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sun Dec 13 06:42:42 2020 from 192.168.56.1
[root@hadoop01 ~]#
Connecting to 192.168.56.201:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sun Dec 13 07:51:28 2020 from 192.168.56.1
[root@hadoop02 ~]#
Connecting to 192.168.56.202:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sun Dec 13 07:52:01 2020
[root@hadoop03 ~]#
修改hosts檔案
在每個節點的hosts
檔案具體是/etc/hosts
尾部新增:
192.168.56.200 hadoop01
192.168.56.201 hadoop02
192.168.56.202 hadoop03
方便後面可以直接通過主機名訪問對應的機器。可以在任意一臺機器用通過主機名ping
任意的主機名:
ping hadoop01
ping hadoop02
ping hadoop03
新增hadoop使用者
新增使用者的操作需要在root
使用者下進行。新增一個使用者分組、命名和密碼都為hadoop
的使用者:
useradd hadoop
# 設定密碼需要手動輸入兩次密碼,筆者這裡也暫時設定密碼為hadoop
passwd hadoop
通過mkdir -p /data/hadoop
建立一個新目錄,後面的hadoop
相關的資料等檔案都放在/data/hadoop
目錄下。設定目錄/data/hadoop
的擁有者為hadoop
使用者:
chown hadoop:hadoop /data/hadoop
最後設定hadoop
使用者可以不輸入密碼直接通過sudo su
提升為root
使用者:
chmod u+w /etc/sudoers
vim /etc/sudoers
# 在sudoers檔案的root使用者一行後面新增下面內容並且儲存
hadoop ALL=(ALL) NOPASSWD:ALL
chmod u-w /etc/sudoers
效果如下:
驗證一下是否成功:
# 在root使用者下切換hadoop使用者
su hadoop
# 在hadoop使用者下無密碼切換root使用者
sudo su
# 效果
[root@localhost]# su hadoop
[hadoop@localhost]$ sudo su
[root@localhost]#
建立hadoop使用者需要在叢集中每臺機器操作一次。
設定叢集機器SSH免登
設定叢集機器SSH
免登這一步十分重要,無論是scp
命令去拷貝檔案到各個機器,還是叢集啟動和通訊過程都依賴這一步。叢集中每個機器都進行下面步驟操作:
- 使用
su hadoop
切換到hadoop
使用者 - 使用
ssh-keygen -t rsa
命令,接著連按幾次回車,生成公鑰,執行完畢後/home/hadoop/.ssh/
目錄下會多了一個id_rsa.pub
- 收集叢集中所有節點的
/home/hadoop/.ssh/id_rsa.pub
內容,彙總合併成一個authorized_keys
檔案,再拷貝該檔案到所有叢集節點的/home/hadoop/.ssh/ssh
目錄下 - 授權
chmod 700 /home/hadoop/.ssh/ && chmod 700 /home/hadoop/ && chmod 600 /home/hadoop/.ssh/authorized_keys
最終筆者的/home/hadoop/.ssh/authorized_keys
檔案內容如下:
可以使用下面的指令碼替代手工操作:
# 拷貝三個節點的RSA公鑰到authorized_keys中,可以在第一個節點中執行即可
for a in {1..3}; do sudo ssh hadoop@hadoop0$a cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys; done
# 拷貝authorized_keys到三個節點中,可以在第一個節點中執行即可
for a in {1..3}; do sudo scp /home/hadoop/.ssh/authorized_keys hadoop@hadoop0$a:/home/hadoop/.ssh/authorized_keys ; done
最終的效果如下:
安裝Hadoop
主要在hadoop01
節點中安裝即可,安裝完畢可以通過scp
命令直接拷貝檔案分發到不同的節點中。賦予使用者/data/hadoop
目錄的讀寫許可權:
su hadoop
sudo chmod -R a+w /data/hadoop
這一步極其重要,否則容易導致執行叢集的時候建立資料夾許可權不足。這裡記住不要主動建立Hadoop
檔案系統中的目錄,否則容易導致DataNode
啟動失敗。
1、解壓安裝
切換目錄和使用者:
su hadoop
cd /data/hadoop
下載和解壓hadoop-3.3.0
:
wget https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
tar -zxvf hadoop-3.3.0.tar.gz
解壓完畢後,/data/hadoop
目錄下會多了一個hadoop-3.3.0
資料夾。
2、環境變數配置
重新命名一下資料夾mv hadoop-3.3.0 app
,也就是最終的HADOOP_HOME
為/data/hadoop/app
,可以先提前修改一下使用者配置vim ~/.bashrc
(所有節點都要新增),新增:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/data/hadoop/app
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
重新整理一下使用者配置source ~/.bashrc
。
3、檢視版本
呼叫hadoop version
:
[hadoop@hadoop01 hadoop]$ hadoop version
Hadoop 3.3.0
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r aa96f1871bfd858f9bac59cf2a81ec470da649af
Compiled by brahma on 2020-07-06T18:44Z
Compiled with protoc 3.7.1
From source with checksum 5dc29b802d6ccd77b262ef9d04d19c4
This command was run using /data/hadoop/app/share/hadoop/common/hadoop-common-3.3.0.jar
這樣就能確定JDK
和Hadoop
的位置配置沒有問題,接著開始配置Hadoop
中的應用配置。
4、Hadoop配置
配置core-site.xml
(具體是/data/hadoop/app/etc/hadoop/core-site.xml
):
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/temp</value>
</property>
</configuration>
fs.defaultFS
:nameNode
的HDFS
協議的檔案系統通訊地址hadoop.tmp.dir
:Hadoop
叢集在工作的時候儲存的一些臨時檔案的目錄
配置hdfs-site.xml
(具體是/data/hadoop/app/etc/hadoop/hdfs-site.xml
):
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop03:50090</value>
</property>
<property>
<name>dfs.http.address</name>
<value>192.168.56.200:50070</value>
</property>
</configuration>
dfs.namenode.name.dir
:NameNode
的資料存放目錄dfs.datanode.data.dir
:DataNode
的資料存放目錄dfs.replication
:HDFS
的副本數dfs.secondary.http.address
:SecondaryNameNode
節點的HTTP
入口地址dfs.http.address
:通過HTTP
訪問HDFS
的Web
管理介面的地址
配置mapred-site.xml
(具體是/data/hadoop/app/etc/hadoop/mapred-site.xml
):
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
mapreduce.framework.name
:選用yarn
,也就是MR
框架使用YARN
進行資源排程。
配置yarn-site.xml
(具體是/data/hadoop/app/etc/hadoop/yarn-site.xml
):
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
yarn.resourcemanager.hostname
:指定ResourceManager
所在的主機名yarn.nodemanager.aux-services
:指定YARN
叢集為MapReduce
程式提供Shuffle
服務
配置workers
檔案(這個檔案在舊版本叫slaves
,因為技術政治化運動被改為workers
,具體是/data/hadoop/app/etc/hadoop/workers
:
hadoop01
hadoop02
hadoop03
至此,核心配置基本完成。
5、分發Hadoop安裝包到其他節點
重點提示三次:
- 所有節點的
Hadoop
安裝包位置和配置資訊必須一致 - 所有節點的
Hadoop
安裝包位置和配置資訊必須一致 - 所有節點的
Hadoop
安裝包位置和配置資訊必須一致
在節點hadoop01
使用scp
命令進行分發:
## 分發節點2
scp -r /data/hadoop/app hadoop@hadoop02:/data/hadoop
## 分發節點3
scp -r /data/hadoop/app hadoop@hadoop03:/data/hadoop
6、格式化NameNode
規劃中是hadoop01
作為NameNode
,在該機器下進行格式化:
hadoop namenode -format
格式化NameNode
成功的控制檯日誌如下:
7、啟動和停止HDFS
可以在任意一個節點中啟動和停止HDFS
,為了簡單起見還是在hadoop01
節點中操作:
- 啟動:
start-dfs.sh
- 停止:
stop-dfs.sh
呼叫啟動命令後,控制檯輸出如下:
[hadoop@hadoop01 hadoop]$ start-dfs.sh
Starting namenodes on [hadoop01]
Starting datanodes
Starting secondary namenodes [hadoop03]
8、啟動和停止YARN
YARN
叢集的啟動命令必須在ResourceManager
節點中呼叫,規劃中的對應角色的節點為hadoop03
,在該機器執行YARN
相關命令:
- 啟動:
start-yarn.sh
- 停止:
stop-yarn.sh
執行啟動命令後,控制檯輸出如下:
[hadoop@hadoop03 data]$ start-yarn.sh
Starting resourcemanager
Starting nodemanagers
9、檢視所有節點的程式狀態
分別檢視叢集中所有節點的程式狀態,可以直接使用jps
工具,具體結果如下:
[hadoop@hadoop01 hadoop]$ jps
8673 NameNode
8823 DataNode
9383 NodeManager
9498 Jps
[hadoop@hadoop02 hadoop]$ jps
4305 DataNode
4849 Jps
4734 NodeManager
[hadoop@hadoop03 data]$ jps
9888 Jps
9554 NodeManager
5011 DataNode
9427 ResourceManager
5125 SecondaryNameNode
可見程式是正常執行的。
10、通過WEB管理介面檢視叢集狀態
訪問入口如下:
HDFS
入口:http://192.168.56.200:50070
(來自於hdfs-site.xml
的dfs.http.address
配置項)YARN
入口:http://192.168.56.202:8088/cluster
(ResourceManager
所在節點的8088
埠)
資料節點狀態如下:
YARN
叢集狀態如下:
使用Hadoop
通過幾個簡單的例子嘗試使用Hadoop
叢集。
建立目錄和展示目錄
測試一下建立目錄和展示目錄:
[hadoop@hadoop01 hadoop]$ hadoop fs -mkdir -p /test
[hadoop@hadoop01 hadoop]$ hadoop fs -ls /
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2020-12-13 10:55 /test
上傳和下載檔案
建立一個words.txt
,寫入內容並且上傳到上一小節建立的test
資料夾中:
cd /data/hadoop
touch words.txt
echo 'hello world' >> words.txt
hadoop fs -put words.txt /test
然後在HDFS
的WEB
介面中檢視:
下載該檔案到/data/hadoop/download.txt
:
[hadoop@hadoop01 hadoop]$ hadoop fs -get /test/words.txt /data/hadoop/download.txt && \
cat /data/hadoop/download.txt
hello world
執行WordCount程式
上傳一個檔案到HDFS
的/test/input
目錄:
cd /data/hadoop && \
hadoop fs -mkdir -p /test/input && \
touch words-input.txt && \
echo 'hello world' >> words-input.txt && \
echo 'hello java' >> words-input.txt && \
echo 'hello hadoop' >> words-input.txt && \
hadoop fs -put words-input.txt /test/input
自帶的例子在目錄/data/hadoop/app/share/hadoop/mapreduce
的hadoop-mapreduce-examples-3.3.0.jar
中,通過命令執行WordCount
程式:
hadoop jar /data/hadoop/app/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /test/input /test/output
MR
的執行過程如下:
檢視YARN
管理介面對應的Job
狀態:
可知任務最終的執行狀態為成功。最後可以通過hadoop fs -cat
命令檢視結果:
[hadoop@hadoop01 hadoop]$ hadoop fs -ls /test/output
Found 2 items
-rw-r--r-- 3 hadoop supergroup 0 2020-12-13 11:19 /test/output/_SUCCESS
-rw-r--r-- 3 hadoop supergroup 32 2020-12-13 11:19 /test/output/part-r-00000
[hadoop@hadoop01 hadoop]$ hadoop fs -cat /test/output/part-r-00000
hadoop 1
hello 3
java 1
world 1
小結
本文花了大量時間詳細記錄瞭如何從零開始搭建一個Hadoop
叢集,基於此才能進一步學習和使用Hadoop
生態中的元件如Hive
、Sqoop
和Hbase
等等,後續會逐個擊破。
(本文完 c-2-d e-a-20201213)