環境及工具
- Hadoop 3.2.0
- Windows 10 1809
- CentOS 7.6.1810
- VMware 15.1.0
- OpenJDK 8(Amazon Corretto 8.222.10.1)
注意事項:由於
javax.*
等擴展庫的原因,使用 JDK 9 及以上版本無法啓動nodemanager
和resourcemanager
分類
- 僞分佈式:只有一個節點
- 完全分佈式:多個節點
不管哪一種方式,都要完成公共部分的配置。
公共部分
1 安裝操作系統
本案例使用標準安裝版鏡像。官方提供的 ISO 鏡像文件如下:
- CentOS-7-x86_64-DVD-1810.iso,標準安裝版(本案例使用)
- CentOS-7-x86_64-Everything-1810.iso,對完整版安裝盤的軟件進行補充,集成所有軟件
- CentOS-7-x86_64-LiveGNOME-1810.iso,GNOME桌面版
- CentOS-7-x86_64-LiveKDE-1810.iso,KDE桌面版
- CentOS-7-x86_64-Minimal-1810.iso,精簡版
- CentOS-7-x86_64-NetInstall-1810.iso,網絡安裝鏡像
1.1 下載地址
- CentOS 官方下載地址:https://www.centos.org/download/
- 阿里雲下載源:https://mirrors.aliyun.com/centos/7.6.1810/isos/x86_64/
1.2 安裝
使用 VMware 加載鏡像進入安裝流程,按照提示操作即可,過程簡單,略。
注意事項:安裝完成重啓進入系統時,用小鍵盤輸入 root 賬號的密碼可能會出錯。
2 網絡參數配置
2.1 配置 VMware 虛擬網絡
(1)從菜單欄依次進入:編輯
、虛擬網絡編輯器
。
(2)點擊開啓 更改設置
,修改 VMnet8
的配置:
- 選擇
類型
爲NAT 模式
- 取消
DHCP 服務
,手動指定靜態 IP 地址 - 設置
子網 IP
,如:192.168.80.0 - 設置
子網掩碼
,如:255.255.255.0 - 點擊進入
NAT 設置
,設置網關 IP
,如:192.168.80.2;可根據需要,進入DNS 設置
指定 DNS 服務器地址
2.2 配置 CentOS 網絡參數
(1)使用 ip addr
命令查看網卡信息。本案例中網卡名稱爲 ens33
(2)根據網卡名稱使用命令 vi /etc/sysconfig/network-scripts/ifcfg-ens33
打開網絡參數配置文件,按 i
進行編輯。
(3)修改配置文件的兩個參數值:
BOOTPROTO=static ##使用靜態 IP
ONBOOT=yes ##開機啓動網卡
(4)根據之前配置的參數值,在配置文件增加以下內容:
IPADDR=192.168.80.80 ##指定本機靜態 IP
NETMASK=255.255.255.0 ##子網掩碼
GATEWAY=192.168.80.2 ##網關 IP
DNS1=223.5.5.5
DNS2=223.6.6.6
(5)更改完後,按 ESC
鍵,然後輸入 :wq
,退出並保存。
附加內容,vi 命令回顧:
:q! 不保存文件,強制退出 vi
:w 保存文件,但不退出 vi
:wq 保存文件,並退出 vi
(6)使用命令 service network restart
重啓網絡,可用 ping
命令測試是否配置成功。
2.3 配置本機虛擬網卡
要使用 SecureCRTPortable 連接虛擬機,要保證本機虛擬網卡 IP 地址與 VMware 虛擬網絡在同一網段:
(1)從任務欄依次進入:網絡和共享中心
、更改適配器設置
、VMnet8 Network Adapter
,修改 IPv4 參數如下:
- IP 地址:192.168.80.1
- 子網掩碼:255.255.255.0
- 默認網關: 192.168.80.2(該項取值實際上並不影響連接,只要 IP 所在網段正確即可)
(2)開啓 SecureCRTPortable,添加連接至 192.168.80.80 即可。
附加內容,如果 SecureCRTPortable 命令行出現亂碼,需要修改字符編碼:
從菜單欄依次進入:Options(選項)
、Session Options(會話選項)
、Terminal(終端)
、Appearance(外觀)
,在右側找到Character encoding
選擇UTF-8
即可。
3 創建普通用戶
(1)創建用戶,使用命令 adduser username
(2)爲用戶設置密碼,使用命令 passwd username
(3)授權 sudo 權限,需要修改 sudoers 文件:
- 定位文件,使用命令
whereis sudoers
,可知文件在/etc/sudoers
- 修改文件權限,默認爲只讀(若修改文件後使用
:wq!
直接覆蓋,則忽略該步驟)
ls -l /etc/sudoers 查看文件權限
chmod -v u+w /etc/sudoers 修改文件權限爲可編輯
- 修改文件,使用
vi /etc/sudoers
進入文件,按照 root 的格式增加以下內容:
root ALL=(ALL) ALL
username ALL=(ALL) ALL
- 還原文件的只讀權限(若修改文件後使用
:wq!
直接覆蓋,則忽略該步驟)
ls -l /etc/sudoers 查看文件權限
chmod -v u-w /etc/sudoers 修改文件權限爲只讀
注意事項:安裝 JDK 和 Hadoop 均使用普通用戶進行。
附加內容,用戶切換:
- 普通用戶切換爲 root 用戶,使用命令
su
,輸入密碼後即可。 - root 用戶切換爲普通用戶,使用命令
su 用戶名
即可。
4 配置主機名及其映射
4.1 修改默認主機名
使用命令:hostnamectl set-hostname node-1
,設置主機名爲 node-1,修改後可用 hostname
命令查看結果:
[root@localhost ~]# hostname
node-1
要看到命令行變更,則需要重啓;如果是 SecureCRTPortable,重新連接即可看到效果:
[root@node-1 ~]#
4.1 配置 IP 與主機名映射
使用命令 vi /etc/hosts
編輯 host 文件:
- 僞分佈式要配置 192.168.80.80 與主機名 node-1 的映射,可增加以下內容:
192.168.80.80 node-1
- 完全分佈式要配置 IP 與主機名的映射,可增加以下內容:
192.168.80.80 node-1
192.168.80.81 node-2
192.168.80.82 node-3
注意事項:多節點情況下,可使用
Send Chat to All Sessions
向全部節點發出指令,批量修改 hosts。
附加內容,向多個虛擬機發送相同命令:
從菜單欄進入View(視圖)
,勾選Chat Window
,在底部窗口右鍵選擇Send Chat to All Sessions
5 配置免密登錄
(1)使用命令 ssh-keygen -t rsa
生成 ssh 密鑰對,均使用默認選項即可,在 ~/.ssh
隱藏目錄下生成 id_rsa
(私鑰)和 id_rsa.pub
(公鑰)
(2)將公鑰複製到需要免密登錄的機器上。例如:執行 ssh-copy-id 192.168.220.11
或 ssh-copy-id node-2
注意事項:在 node-1 使用
ssh node-1
連接自身也會提示需要輸入密碼,因此自身也複製一份,執行ssh-copy-id node-1
即可。
6 關閉防火牆
使用命令 systemctl status firewalld
查看防火牆狀態,出現 Active: active (running)
說明防火牆開啓;出現 Active: inactive (dead)
說明防火牆關閉。可使用如下命令操作防火牆:
- 臨時關閉防火牆:
systemctl stop firewalld
- 臨時開啓防火牆:
systemctl start firewalld
- 永久關閉防火牆:
systemctl disable firewalld
- 永久開啓防火牆:
systemctl enable firewalld
注意事項:臨時關閉或開啓防火牆,當重啓時會回覆之前的狀態;永久開啓或關閉防火牆,重啓後生效。
7 安裝 JDK
(1)切換到普通用戶
(2)上傳 amazon-corretto-8.222.10.1-linux-x64.tar.gz
到 ~
目錄
(3)在 home/username
目錄下新建 java 文件夾
(4)執行命令:tar zxvf amazon-corretto-8.222.10.1-linux-x64.tar.gz -C java/
(5)修改 /etc/profile
文件,在末尾添加內容後保存:
#set java environment
export JAVA_HOME=/home/username/java/amazon-corretto-8.222.10.1-linux-x64
export JRE_HOME=/home/username/java/amazon-corretto-8.222.10.1-linux-x64/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
(5)使用命令:source /etc/profile
,讓環境變量生效
(6)輸入命令:java -version
,查看 JDK 是否安裝成功,如果安裝成功則顯示版本號信息:
openjdk version "1.8.0_222"
OpenJDK Runtime Environment Corretto-8.222.10.1 (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM Corretto-8.222.10.1 (build 25.222-b10, mixed mode)
8 安裝 Hadoop
(1)切換到普通用戶
(2)下載壓縮包:http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.0/
(3)上傳 hadoop-3.2.0.tar.gz
到 ~
目錄
(4)在 home/username
目錄下新建 hadoop 文件夾
(5)執行命令:tar zxvf hadoop-3.2.0.tar.gz -C hadoop/
(6)修改 /etc/profile
文件,在末尾添加內容後保存:
# set hadoop and sbin path
export HADOOP_HOME=/home/username/hadoop/hadoop-3.2.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
(7)使用命令:source /etc/profile
,讓環境變量生效
(8)輸入命令:hadoop version
,查看是否安裝成功,如果安裝成功則顯示版本號信息:
Hadoop 3.2.0
Source code repository https://github.com/apache/hadoop.git -r e97acb3bd8f3befd27418996fa5d4b50bf2e17bf
Compiled by sunilg on 2019-01-08T06:08Z
Compiled with protoc 2.5.0
From source with checksum d3f0795ed0d9dc378e2c785d3668f39
This command was run using /opt/hadoop/hadoop-3.2.0/share/hadoop/common/hadoop-common-3.2.0.jar
僞分佈式的搭建
由於僞分佈式僅有一個節點,使用 192.168.80.80 一個虛擬機即可完成,完成公共部分的步驟後,再進行如下配置:
1 配置文件
需要配置的文件如下:
- hadoop-3.2.0/etc/hadoop/hadoop-env.sh
- hadoop-3.2.0/etc/hadoop/core-site.xml
- hadoop-3.2.0/etc/hadoop/hdfs-site.xml
- hadoop-3.2.0/etc/hadoop/mapred-site.xml
- hadoop-3.2.0/etc/hadoop/yarn-site.xml
- hadoop-3.2.0/etc/hadoop/workers
注意事項:配置文件中尖括號前後、單詞前後的不必要空格會導致啓動失敗!
1.1 hadoop-env.sh
在文件中找到以下內容,解開註釋,添加 JAVA_HOME
路徑:
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/home/username/java/amazon-corretto-8.222.10.1-linux-x64
1.2 core-site.xml
在該文件中添加如下內容:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node-1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
</configuration>
(1)指定 Hadoop 所使用的文件系統以及 namenode 地址,使用 IP 地址或主機名均可
(2)指定 namenode 上本地的 hadoop 臨時文件夾
1.3 hdfs-site.xml
在該文件中添加如下內容:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
指定 HDFS 副本個數,配置默認是 3,應小於 datanode 機器數量
1.4 mapred-site.xml
在該文件中添加如下內容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
指定 MapReduce 運行框架爲 yarn,默認爲 local
1.5 yarn-site.xml
在該文件中添加如下內容:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
(1)指定 resourcemanager 的地址,使用主機名
(2)nodemanager 運行的附屬服務,要配置成 mapreduce_shuffle
,纔可以運行 MapReduce 程序默認值
1.6 workers
添加從節點。僞分佈式模式中,只有一個 node-1 節點:
node-1
注:Hadoop 3.0 以前的版本是 slaves 文件
2 啓動 Hadoop
2.1 格式化
啓動 Hadoop 集羣,需要分別啓動 HDFS 集羣和 Yarn 集羣。首次啓動前,HDFS 在物理上不存在,需要要進行格式化。使用以下命令:
hdfs namenode -format
注意事項:
- 首次格式化之後,若集羣啓動成功,就不要再進行格式化
- 如有必要(例如在管理界面 LiveNode 爲 0,datanode 日誌有異常時),應刪除 tmp 文件夾內容後,重新格式化
- 格式化應在 namenode 所在節點進行。
2.2 啓動腳本
如果配置了免密登錄、workers 文件,則可以使用啓動腳本。在 /sbin
目錄下有四個腳本文件:start-dfs.sh
、stop-dfs.sh
、start-yarn.sh
、stop-yarn.sh
,分別用於啓動或停止 HDFS 和 Yarn。
使用 start-dfs.sh
、start-yarn.sh
後,用 jps 命令查看進程,出現如下 6 個進程說明已經成功啓動:
8306 Jps
7300 NameNode
7972 NodeManager
7845 ResourceManager
7446 DataNode
7627 SecondaryNameNode
2.3 可視化界面
YARN NodeManager:http://192.168.80.80:9870
YARN ResourceManager:http://192.168.80.80:8088
附加內容:Hadoop 3.x 端口號與 2.x 的比較
分類 | 應用 | Haddop 2.x port | Haddop 3.x port |
---|---|---|---|
NNPorts | Namenode | 8020 | 9820 |
NNPorts | NN HTTP UI | 50070 | 9870 |
NNPorts | NN HTTPS UI | 50470 | 9871 |
SNN ports | SNN HTTP | 50091 | 9869 |
SNN ports | SNN HTTP UI | 50090 | 9868 |
DN ports | DN IPC | 50020 | 9867 |
DN ports | DN | 50010 | 9866 |
DN ports | DN HTTP UI | 50075 | 9864 |
DN ports | Namenode | 50475 | 9865 |
完全分佈式的搭建
以 3 個節點構成的集羣爲例,每個節點都需要完成公共部分的步驟。節點的部署如下表:
hostname | IP | NameNode | DataNode | SecondaryNameNode | NodeManager | ResourceManager |
---|---|---|---|---|---|---|
node-1 | 192.168.80.80 | △ | △ | △ | ||
node-2 | 192.168.80.81 | △ | △ | △ | ||
node-3 | 192.168.80.82 | △ | △ | △ |
注意事項:
- 各節點執行 JDK 安裝、Hadoop 安裝、格式化、文件下發、啓動或停止集羣的用戶名要相同
- 各節點的 hosts 要相同
- 各節點的 Hadoop 配置文件要相同
- 配置 node-1 分別到 node-2、node-3 的免密登錄
- 各節點要分別修改網絡參數、主機名
- 由於 ResourceManager 部署在 node-3,因此需要配置 node-3 分別到 node-1、node-2 的免密登錄
1 同步時間
有手動同步和網絡授時兩種方式:
(1)手動同步
使用命令 date –s "2019-01-01 05:05:05"
(2)網絡授時
安裝插件 yum install ntpdate
,安裝成功後可使用命令 ntpdate cn.pool.ntp.org
進行網絡授時。
2 配置文件
需要配置的文件如下:
- hadoop-3.2.0/etc/hadoop/hadoop-env.sh
- hadoop-3.2.0/etc/hadoop/core-site.xml
- hadoop-3.2.0/etc/hadoop/hdfs-site.xml
- hadoop-3.2.0/etc/hadoop/mapred-site.xml
- hadoop-3.2.0/etc/hadoop/yarn-site.xml
- hadoop-3.2.0/etc/hadoop/workers
注意事項:配置文件中尖括號前後、單詞前後的不必要空格會導致啓動失敗!
2.1 hadoop-env.sh(與僞分佈式相同)
在文件中找到以下內容,解開註釋,添加 JAVA_HOME
路徑:
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/home/username/java/amazon-corretto-8.222.10.1-linux-x64
2.2 core-site.xml(與僞分佈式相同)
在該文件中添加如下內容:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node-1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/username/hadoop/tmp</value>
</property>
</configuration>
(1)指定 Hadoop 所使用的文件系統以及 namenode 地址,使用 IP 地址或主機名均可
(2)指定 namenode 上本地的 hadoop 臨時文件夾
2.3 hdfs-site.xml
在該文件中添加如下內容:
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/username/hadoop/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/username/hadoop/data</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node-2:9868</value>
</property>
</configuration>
(1)指定 HDFS 副本個數,配置默認是 3,應小於 datanode 機器數量
(2)指定元數據存儲位置
(3)指定 datanode 存儲位置
(4)指定 SecondaryNameNode 地址,使用 IP 地址或主機名均可
2.4 mapred-site.xml(與僞分佈式相同)
在該文件中添加如下內容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
指定 MapReduce 運行框架爲 yarn,默認爲 local
2.5 yarn-site.xml
在該文件中添加如下內容:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-3</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
(1)指定 resourcemanager 的地址,使用主機名
(2)nodemanager 運行的附屬服務,要配置成 mapreduce_shuffle
,纔可以運行 MapReduce 程序默認值
2.6 workers
添加從節點:
node-1
node-2
node-3
注:Hadoop 3.0 以前的版本是 slaves 文件
3 下發文件
可通過 scp 命令下發文件給其他節點,保持文件一致性。
(1)將 node-1 的 /home/username/hadoop/hadoop-3.2.0/etc
所有文件下發到 node-2 的對應位置,可在 node-1 執行如下命令:
scp -r /home/username/hadoop/hadoop-3.2.0/etc username@node-2:/home/username/hadoop/hadoop-3.2.0/etc
(2)將 node-1 的環境變量下發到 node-2 的對應位置,可在 node-1 執行如下命令:
scp -r /etc/profile username@node-2:/etc/profile
(3)將 node-1 的 hosts 下發到 node-2 的對應位置,可在 node-1 執行如下命令:
scp -r /etc/hosts username@node-2:/etc/hosts
4 啓動 Hadoop
4.1 格式化
啓動 Hadoop 集羣,需要分別啓動 HDFS 集羣和 Yarn 集羣。首次啓動前,HDFS 在物理上不存在,需要要進行格式化。使用以下命令:
hdfs namenode -format
注意事項:
- 首次格式化之後,若集羣啓動成功,就不要再進行格式化
- 如有必要(例如在管理界面 LiveNode 爲 0,datanode 日誌有異常時),應刪除 tmp 文件夾內容後,重新格式化
- 格式化應在 namenode 所在節點進行。
4.2 啓動腳本
如果配置了免密登錄、workers 文件,則可以使用啓動腳本。在 /sbin
目錄下有四個腳本文件:start-dfs.sh
、stop-dfs.sh
、start-yarn.sh
、stop-yarn.sh
,分別用於啓動或停止 HDFS 和 Yarn。
根據部署,在 node-1 使用 start-dfs.sh
,在 node-3 使用 start-yarn.sh
後,用 jps 命令查看各節點進程如下:
[username@node-1 root]$ jps
7301 NameNode
7733 NodeManager
7446 DataNode
7847 Jps
[username@node-2 root]$ jps
7430 NodeManager
7543 Jps
7304 SecondaryNameNode
7225 DataNode
[username@node-3 root]$ jps
7209 DataNode
7385 ResourceManager
7849 Jps
7517 NodeManager
4.3 可視化界面
YARN NodeManager:http://192.168.80.80:9870
YARN ResourceManager:http://192.168.80.82:8088
其它
若以 root 身份登錄時,啓動集羣可能報如下錯誤:
[root@node-1 sbin]# ./start-all.sh
Starting namenodes on [node-1]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [node-2]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
Starting resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
Starting nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.
解決方案 1:
(1)在 start-dfs.sh
、stop-dfs.sh
文件開頭添加以下參數:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
(2)在 start-yarn.sh
、stop-yarn.sh
文件開頭添加以下參數:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
解決方案 2:以非 root 身份登錄。