CentOS7搭建Hadoop-3.3.0集羣手記

前提

這篇文章是基於Linux系統CentOS7搭建Hadoop-3.3.0分佈式集羣的詳細手記。java

基本概念

Hadoop中的HDFSYARN都是主從架構,主從架構會有一主多從和多主多從兩種架構,這裏爲了簡化搭建集羣的流程,這裏使用一主多從的架構。Hadoop集羣中各個角色的名稱以下:node

服務 主節點 從節點
HDFS NameNode DataNode
YARN ResourceManager NodeManager

還有SecondaryNameNode,實際上是NameNode的備用節點,定時合併和處理日誌而且反饋到NameNode上。通常NameNode和SecondaryNameNode儘可能不要放在同一個節點。git

HDFS服務和YARN實際上是分離的,一者是數據存儲,另外一者是資源調度,Hadoop集羣能夠只啓用YARN集羣作資源調度。web

測試集羣服務器規劃

測試的Hadoop集羣使用了3臺基於VirtualBox搭建的CentOS7虛擬機:shell

內網IP 主機名 用戶 虛擬磁盤空間 HDFS角色 YARN角色
192.168.56.200 hadoop01 hadoop 30GB NameNodeDataNode NodeManager
192.168.56.201 hadoop02 hadoop 30GB DataNode NodeManager
192.168.56.202 hadoop03 hadoop 30GB SecondaryNameNodeDataNode ResourceManagerNodeManager

前置軟件安裝或者準備工做

主要包括必要的軟件安裝、用戶建立和網絡配置等等。apache

關閉防火牆

爲了不出現部分端口沒法訪問,內網環境下每臺虛擬機均可以直接關閉防火牆:vim

# 中止防火牆進程
systemctl stop firewalld.service

# 禁用防火牆開機啓動
systemctl disable firewalld.service

JDK安裝

JDK的安裝比較簡單,這裏過程略過。筆者使用的JDKOpenJDK,版本是1.8.0_252-b09JDK路徑配置以下:bash

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啓動失敗。

一、解壓安裝

切換目錄和用戶:

  • 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文件夾。

二、環境變量配置

重命名一下文件夾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

三、查看版本

調用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

這樣就能肯定JDKHadoop的位置配置沒有問題,接着開始配置Hadoop中的應用配置。

四、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.defaultFSnameNodeHDFS協議的文件系統通訊地址
  • hadoop.tmp.dirHadoop集羣在工做的時候存儲的一些臨時文件的目錄

配置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.dirNameNode的數據存放目錄
  • dfs.datanode.data.dirDataNode的數據存放目錄
  • dfs.replicationHDFS的副本數
  • dfs.secondary.http.addressSecondaryNameNode節點的HTTP入口地址
  • dfs.http.address:經過HTTP訪問HDFSWeb管理界面的地址

配置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

至此,核心配置基本完成。

五、分發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

六、格式化NameNode

規劃中是hadoop01做爲NameNode,在該機器下進行格式化:

hadoop namenode -format

格式化NameNode成功的控制檯日誌以下:

七、啓動和中止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]

八、啓動和中止YARN

YARN集羣的啓動命令必須在ResourceManager節點中調用,規劃中的對應角色的節點爲hadoop03,在該機器執行YARN相關命令:

  • 啓動:start-yarn.sh
  • 中止:stop-yarn.sh

執行啓動命令後,控制檯輸出以下:

[hadoop@hadoop03 data]$ start-yarn.sh 
Starting resourcemanager
Starting nodemanagers

九、查看全部節點的進程狀態

分別查看集羣中全部節點的進程狀態,能夠直接使用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

可見進程是正常運行的。

十、經過WEB管理界面查看集羣狀態

訪問入口以下:

  • HDFS入口:http://192.168.56.200:50070(來自於hdfs-site.xmldfs.http.address配置項)
  • YARN入口:http://192.168.56.202:8088/clusterResourceManager所在節點的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

而後在HDFSWEB界面中查看:

下載該文件到/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/mapreducehadoop-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生態中的組件如HiveSqoopHbase等等,後續會逐個擊破。

(本文完 c-2-d e-a-20201213)

相關文章
相關標籤/搜索