這篇文章是基於Linux
系統CentOS7
搭建Hadoop-3.3.0
分佈式集羣的詳細手記。java
Hadoop
中的HDFS
和YARN
都是主從架構,主從架構會有一主多從和多主多從兩種架構,這裏爲了簡化搭建集羣的流程,這裏使用一主多從的架構。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 |
NameNode 、DataNode |
NodeManager |
192.168.56.201 |
hadoop02 |
hadoop |
30GB |
DataNode |
NodeManager |
192.168.56.202 |
hadoop03 |
hadoop |
30GB |
SecondaryNameNode 、DataNode |
ResourceManager 、NodeManager |
主要包括必要的軟件安裝、用戶建立和網絡配置等等。apache
爲了不出現部分端口沒法訪問,內網環境下每臺虛擬機均可以直接關閉防火牆:vim
# 中止防火牆進程 systemctl stop firewalld.service # 禁用防火牆開機啓動 systemctl disable firewalld.service
JDK
的安裝比較簡單,這裏過程略過。筆者使用的JDK
是OpenJDK
,版本是1.8.0_252-b09
,JDK
路徑配置以下: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
文件具體是/etc/hosts
尾部添加:
192.168.56.200 hadoop01 192.168.56.201 hadoop02 192.168.56.202 hadoop03
方便後面能夠直接經過主機名訪問對應的機器。能夠在任意一臺機器用經過主機名ping
任意的主機名:
ping hadoop01 ping hadoop02 ping hadoop03
添加用戶的操做須要在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
免登這一步十分重要,不管是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
最終的效果以下:
主要在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
這樣就能肯定JDK
和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.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
至此,核心配置基本完成。
重點提示三次:
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
規劃中是hadoop01
做爲NameNode
,在該機器下進行格式化:
hadoop namenode -format
格式化NameNode
成功的控制檯日誌以下:
能夠在任意一個節點中啓動和中止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
集羣的啓動命令必須在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
可見進程是正常運行的。
訪問入口以下:
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@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
上傳一個文件到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)