天天看點

Hadoop 分布式叢集安裝

Hadoop 介紹

Hadoop 從 2.x 開始,逐漸演變成:HDFS,YARN,MapReduce 三大應用子產品,這三個應用子產品分别的能力和作用是:

  • HDFS:分布式檔案系統,用來解決海量大檔案的存儲問題
  • MapReduce:一套通用的用來解決海量大檔案計算的程式設計模型 API
  • YARN:資源排程/管理系統

其中需要注意的是:這三者之間的關系。彼此獨立,又互相依賴。使用 MapReduce 的分布式程式設計 API 編寫分布式計算應用程式,讀取存儲在 HDFS 上的海量大檔案進行計算,由 YARN 提供計算資源。HDFS 和 YARN 可以獨立運作。主要表現在:

  • 使用 MapReduce 編寫的應用程式也可以運作在其他資源排程系統之上。
  • 使用其他程式設計模型編寫的應用程式,比如 Storm,Spark,Flink 等也可運作在 YARN 叢集上。

是以稱 Hadoop 是一個分布式的成熟解決方案。安裝 Hadoop,其實就是安裝 HDFS 和 YARN 兩個叢集。HDFS 和 YARN 都是一個一主多從的叢集。

HDFS 叢集:

一個NameNode主節點/管理節點 
多個DataNode從節點/工作節點      

YARN叢集:

一個ResourceManager主節點/管理節點 
多個NodeManager從節點/工作節點      

版本選擇

現在 Hadoop 經曆四個大版本:

  • hadoop-0.x:古老的Hadoop,連 YARN 都沒有,現在應該沒有任何企業還在使用這麼古老的 Hadoop 了。
  • hadoop-1.x:基本淘汰的Hadoop版本,不用考慮。
  • hadoop-2.x:現階段主流的使用版本。
  • hadoop-3.x:目前較新的Hadoop版本,提供了很多新特性,但是更新的企業還是比較少。

本文安裝的是 hadoop-2.7.4 版本。

節點規劃

節點名稱 HDFS角色 YARN角色
hadoop1 NameNode ResourceManager
hadoop2 SecondaryNameNode + DataNode NodeManager
hadoop3 DataNode

SSH 免密登入配置

為了友善後續拷貝檔案以及執行腳本,配置 SSH 免密登入。在 hadoop1 上生成 RSA 非對稱密鑰對:

[root@hadoop1 hadoop]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wkMiPVpbBtjoZwBIpyvvluYtfQM9hQeHtgBFVfrwL1I root@hadoop1
The key's randomart image is:
+---[RSA 2048]----+
|+o.O+..o.        |
|. *.o.+..        |
| o..=o*=         |
|  o+oOo+o        |
|...o..+oE        |
|..  . o+ .       |
|  .o .... .      |
| .=.. o. .       |
| +o... .         |
+----[SHA256]-----+      

将公鑰拷貝到叢集中的其他機器:

[root@hadoop1 hadoop]# ssh-copy-id root@hadoop1
[root@hadoop1 hadoop]# ssh-copy-id root@hadoop2
[root@hadoop1 hadoop]# ssh-copy-id root@hadoop3      

解壓檔案

檔案包括 hadoop 和 jdk 的壓縮包,運作 hadoop 依賴 JAVA 環境,是以需要安裝 jdk。

tar -xzvf hadoop-2.7.4.tar.gz
tar -xzvf jdk-8u181-linux-x64.tar.gz
mkdir /software
mv jdk1.8.0_181/ /software/jdk
mv hadoop-2.7.4 /software/hadoop      

配置環境變量

在 hadoop1 編輯 /etc/profile 檔案:

vim /etc/profile
export HADOOP_HOME=/software/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export JAVA_HOME=/software/jdk
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile      

拷貝到其他兩台機器上:

scp  /etc/profile root@hadoop2:/etc/profile 
scp  /etc/profile  root@hadoop3:/etc/profile      

配置 host 記錄

編輯 /etc/hosts 檔案:

192.168.1.117 hadoop1
192.168.1.118 hadoop2
192.168.1.119 hadoop3      
scp  /etc/hosts root@hadoop2:/etc/hosts
scp  /etc/hosts root@hadoop3:/etc/hosts      

修改配置檔案

配置檔案存放在 etc/hadoop 目錄下。

修改 hadoop-env.sh 腳本檔案:

export JAVA_HOME=/software/jdk      

修改 hdfs-site.xml 配置檔案:

<configuration>
    <!--datanode資料存儲目錄-->
   <property>
       <name>dfs.datanode.data.dir</name>
       <value>file:///software/hadoop/data/datanode</value>
   </property>
   <!--namenode資料存儲目錄-->
   <property>
       <name>dfs.namenode.name.dir</name>
       <value>file:///software/hadoop/data/namenode</value>
   </property>
  <!--namenode WebUI 使用的監聽位址-->
   <property>
       <name>dfs.namenode.http-address</name>
       <value>hadoop1:50070</value>
   </property>
   <!--secondary namenode WebUI 使用的監聽位址-->
   <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop2:50090</value>
   </property>
    <!--HDFS的資料塊的副本存儲個數-->
   <property>
        <name>dfs.replication</name>
        <value>3</value>
   </property>
</configuration>      

修改 core-site.xml 配置檔案:

<!--HDFS叢集的url,預設端口8020-->
<configuration>
     <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop1/</value>
     </property>
</configuration>      

配置 yarn-site.xml 配置檔案:

<configuration>
    <!--ResourceManager對外WebUI位址,預設端口8088-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop1</value>
    </property>
</configuration>      

修改 slaves 配置檔案:

hadoop2
hadoop3      

将剛才修改的配置檔案拷貝到其他兩個機器:

scp -r /software/hadoop/ root@hadoop2:/software/
scp -r /software/hadoop/ root@hadoop3:/software/      

HDFS 叢集的初始化

在 hadoop1 上執行如下指令:

hdfs namenode -format      
Hadoop 分布式叢集安裝

出現如上提示,則說明初始化成功。切記:關于初始化操作,是第一次安裝 Hadoop 叢集的時候初始化一次就可以了,而不是後面每次使用的都需要初始化一次。如果你想要把一個舊 HDFS 叢集的資料都給删掉,當做一個新叢集來使用。那麼你可以重新初始化,但是你還是要記得把對應的每個節點資料存儲目錄先行删掉,然後再初始化,這樣你就又得到了一個新的 HDFS 叢集。

啟動 HDFS 叢集

[root@hadoop1 hadoop]# start-dfs.sh 
Starting namenodes on [hadoop1]
hadoop1: starting namenode, logging to /software/hadoop/logs/hadoop-root-namenode-hadoop1.out
hadoop3: starting datanode, logging to /software/hadoop/logs/hadoop-root-datanode-hadoop3.out
hadoop2: starting datanode, logging to /software/hadoop/logs/hadoop-root-datanode-hadoop2.out
Starting secondary namenodes [hadoop2]
hadoop2: starting secondarynamenode, logging to /software/hadoop/logs/hadoop-root-secondarynamenode-hadoop2.out      

啟動 YARN 叢集

[root@hadoop1 hadoop]# start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /software/hadoop/logs/yarn-root-resourcemanager-hadoop1.out
hadoop3: starting nodemanager, logging to /software/hadoop/logs/yarn-root-nodemanager-hadoop3.out
hadoop2: starting nodemanager, logging to /software/hadoop/logs/yarn-root-nodemanager-hadoop2.out      

檢查 Hadoop 叢集狀态

在每台機器上通過 Jps 指令檢視運作的 Java 程序:

[root@hadoop1 hadoop]# jps
21444 Jps
20888 NameNode
21182 ResourceManager
[root@hadoop2 ~]# jps
15328 SecondaryNameNode
15410 NodeManager
15210 DataNode
15531 Jps
[root@hadoop3 ~]# jps
13252 DataNode
13495 Jps
13375 NodeManager      

檢視 HDFS 叢集狀态:

[root@hadoop1 hadoop]# hdfs dfsadmin -report
Configured Capacity: 107321753600 (99.95 GB)
Present Capacity: 84270903296 (78.48 GB)
DFS Remaining: 84270845952 (78.48 GB)
DFS Used: 57344 (56 KB)
DFS Used%: 0.00%
Under replicated blocks: 2
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
-------------------------------------------------
Live datanodes (2):
Name: 192.168.1.118:50010 (hadoop2)
Hostname: hadoop2
Decommission Status : Normal
Configured Capacity: 53660876800 (49.98 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 11528269824 (10.74 GB)
DFS Remaining: 42132578304 (39.24 GB)
DFS Used%: 0.00%
DFS Remaining%: 78.52%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Fri May 07 10:37:06 CST 2021
Name: 192.168.1.119:50010 (hadoop3)
Hostname: hadoop3
Decommission Status : Normal
Configured Capacity: 53660876800 (49.98 GB)
DFS Used: 28672 (28 KB)
Non DFS Used: 11522580480 (10.73 GB)
DFS Remaining: 42138267648 (39.24 GB)
DFS Used%: 0.00%
DFS Remaining%: 78.53%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Fri May 07 10:37:09 CST 2021      

在 HDFS WebUI 檢視叢集狀态:

Hadoop 分布式叢集安裝
Hadoop 分布式叢集安裝

檢視 YARN 叢集狀态:

[root@hadoop1 hadoop]# yarn node -list
21/05/07 11:49:51 INFO client.RMProxy: Connecting to ResourceManager at hadoop1/192.168.1.117:8032
Total Nodes:2
         Node-Id             Node-State Node-Http-Address       Number-of-Running-Containers
   hadoop2:43025                RUNNING      hadoop2:8042                                  0
   hadoop3:34439                RUNNING      hadoop3:8042                                  0      

在 YARN WebUI 檢視叢集狀态:

Hadoop 分布式叢集安裝

Hadoop 叢集,包含了 HDFS 和 YARN 兩個叢集,是以兩個叢集都分别做一次測試。

HDFS叢集:上傳一個檔案檢視是否存在:

#在HDFS中建立一個目錄
hadoop fs -mkdir /wcinput
#将本機/root/wordcount.txt檔案上傳到HDFS的/wcinput目錄中
hadoop fs -put /root/wordcount.txt /wcinput      

wordcount.txt 檔案内容如下:

hello world
hello hadoop
hello hbase      

在 HDFS WebUI界面檢視上傳的檔案:

Hadoop 分布式叢集安裝

YARN叢集:送出一個 mapreduce 計算任務,計算剛剛上傳的 wordcount.txt 檔案中每個詞出現的次數,将結果輸出到 HDFS 的 /wcoutput 目錄:

[root@hadoop1 mapreduce]# hadoop jar /software/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-ex      
Hadoop 分布式叢集安裝

檢視 wcoutput 目錄,可以看到有一個 part-r-00000 檔案,裡面存放的是計算的結果:

[root@hadoop1 mapreduce]# hadoop fs -ls /wcoutput
Found 2 items
-rw-r--r--   3 root supergroup          0 2021-05-07 00:20 /wcoutput/_SUCCESS
-rw-r--r--   3 root supergroup         33 2021-05-07 00:20 /wcoutput/part-r-00000
[root@hadoop1 mapreduce]# hadoop fs -cat /wcoutput/part-r-00000
hadoop  1
hbase   1
hello   3
world   1