Spark其實是Hadoop生態圈的一部分,需要用到Hadoop的HDFS、YARN等組件。
為了方便我們的使用,Spark官方已經為我們將Hadoop與scala組件集成到spark里的安裝包,解壓開箱即可使用,給我們提供了很大的方便。
如果我們只是本地學習的spark,又不想搭建復雜的hadoop集群,就可以使用該安裝包。
spark-3.2.0-bin-hadoop3.2-scala2.13.tgz
但是,如果是生產環境,想要搭建集群,或者后面想要自定義一些hadoop配置,就可以單獨搭建Hadoop集群,后面再與spark進行整合。(推薦)
下面講一下Hadoop集群環境的搭建。

三台服務器,需要提前做好初始化,配置好主機名、免密登錄與JDK配置等等。
參考前面一篇文章:Spark集群環境搭建——服務器環境初始化
https://www.cnblogs.com/doublexi/p/15623436.html
搭建Hadoop集群
1、下載:
Hadoop官網地址:http://hadoop.apache.org/
下載地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/
cd /data/apps/shell/software wget https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz
2、解壓安裝Hadoop
解壓:
tar xf hadoop-3.2.2.tar.gz mv hadoop-3.2.2 /data/apps/
編輯環境變量:
vim /etc/profile ##HADOOP_HOME export HADOOP_HOME=/data/apps/hadoop-3.2.2/ export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source生效:
source /etc/profile
測試:
# hadoop version Hadoop 3.2.2 Source code repository Unknown -r 7a3bc90b05f257c8ace2f76d74264906f0f7a932 Compiled by hexiaoqiao on 2021-01-03T09:26Z Compiled with protoc 2.5.0 From source with checksum 5a8f564f46624254b27f6a33126ff4 This command was run using /data/apps/hadoop-3.2.2/share/hadoop/common/hadoop-common-3.2.2.jar
3、集群配置:
3.1、HDFS集群配置:
配置:hadoop-env.sh
將JDK路徑明確配置給HDFS
cd /data/apps/hadoop-3.2.2/etc/hadoop/ vim hadoop-env.sh ... export JAVA_HOME=/usr/java/jdk1.8.0_162 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
指定NameNode節點以及數據存儲目錄(修改core-site.xml)
vim core-site.xml
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://dev-spark-master-206:8020</value>
</property>
<!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/apps/hadoop-3.2.2/data/tmp</value>
</property>
</configuration>
core-site.xml的默認配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/coredefault.xml
指定secondarynamenode節點(修改hdfs-site.xml)
vim hdfs-site.xml
<configuration>
<!-- 指定Hadoop輔助名稱節點主機配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>dev-spark-slave-172:50090</value>
</property>
<!--副本數量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
官方默認配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/hdfsdefault.xml
指定datanode從節點(修改workers文件,每個節點配置信息占一行)
注意:這里hadoop2.x是用slaves文件,3.x是用workers文件
vim workers
dev-spark-master-206 dev-spark-slave-171 dev-spark-slave-172
注意:該文件中添加的內容結尾不允許有空格,文件中不允許有空行。
3.2、MapReduce集群配置
指定MapReduce使用的jdk路徑(修改mapred-env.sh)
vim mapred-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_162
指定MapReduce計算框架運行Yarn資源調度框架(修改mapred-site.xml)
vim mapred-site.xml
<configuration>
<!-- 指定MR運行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定MR環境變量 -->
<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>
mapred-site.xml默認配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-mapreduce-client/hadoop-mapreduceclient-core/mapred-default.xml
3.3、Yarn集群配置
編輯yarn-env.sh,指定JDK路徑
vim yarn-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_162
指定ResourceMnager的master節點信息(修改yarn-site.xml)
vim yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>dev-spark-slave-172</value>
</property>
<!-- Reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
yarn-site.xml的默認配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-yarn/hadoop-yarn-common/yarndefault.xml
指定NodeManager節點(slaves文件已修改)
注意:
Hadoop安裝目錄所屬用戶和所屬用戶組信息,默認是501 dialout,而我們操作Hadoop集群的用戶使用的是虛擬機的root用戶,
所以為了避免出現信息混亂,修改Hadoop安裝目錄所屬用戶和用戶組!!
chown -R root:root /data/apps/hadoop-3.2.2
3.4、將Hadoop安裝包發送到其他節點
[root@dev-spark-master-206 ~]# cd /data/apps/ # 將hadoop安裝包發送到其他兩台服務器相同的目錄 [root@dev-spark-master-206 apps]# rsync-script hadoop-3.2.2/
在其他兩台服務器上,也需要重新編輯一下環境變量,並source加載
# 檢查三台服務器上是否有這個hadoop包,以及環境變量配置 # vim /etc/profile ##HADOOP_HOME export HADOOP_HOME=/data/apps/hadoop-3.2.2/ export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
三台機器上都要source一下
source /etc/profile
三台機器上運行hadoop命令測試:
# hadoop version Hadoop 3.2.2 Source code repository Unknown -r 7a3bc90b05f257c8ace2f76d74264906f0f7a932 Compiled by hexiaoqiao on 2021-01-03T09:26Z Compiled with protoc 2.5.0 From source with checksum 5a8f564f46624254b27f6a33126ff4 This command was run using /data/apps/hadoop-3.2.2/share/hadoop/common/hadoop-common-3.2.2.jar
3.5、集群初始化:
注意:如果集群是第一次啟動,需要在Namenode所在節點格式化NameNode,非第一次不用執行格式化Namenode操作!!
新版都用hdfs namenode命令,舊版用hadoop namenode
# 注意,只能執行一次,后面再執行會破壞之前的集群環境 hdfs namenode -format
初始化成功后,輸出日志里會顯示”successfully formatted”
3.6、啟動集群:
方式一:手動一個個服務啟動:
啟動HDFS:
在master上啟動NameNode
[root@dev-spark-master-206 hadoop-3.2.2]# hadoop-daemon.sh start namenode
在master和slave節點,啟動DataNode
在dev-spark-master-206上啟動datanode
[root@dev-spark-master-206 hadoop-3.2.2]# hadoop-daemon.sh start datanode # jps查看是否有namenode和datanode的進程 [root@dev-spark-master-206 hadoop-3.2.2]# jps
在dev-spark-slave-171上,啟動datanode
[root@dev-spark-slave-171 ~]# hadoop-daemon.sh start datanode # 查看是否有datanode的進程 [root@dev-spark-slave-171 ~]# jps
在dev-spark-slave-172上,啟動datanode
[root@dev-spark-slave-172 ~]# hadoop-daemon.sh start datanode # 查看是否有datanode進程 [root@dev-spark-slave-172 ~]# jps
Yarn集群單節點啟動:
注意:NameNode和ResourceManger不是在同一台機器,不能在NameNode上啟動 YARN,應該在ResouceManager所在的機器上啟動YARN。
按照我們集群的規划,我們在dev-spark-slave-172上啟動resourcemanager和nodemanager
[root@dev-spark-slave-172 ~]# yarn-daemon.sh start resourcemanager [root@dev-spark-slave-172 ~]# yarn-daemon.sh start nodemanager # 查看是否有 ResourceManager和 NodeManager進程 [root@dev-spark-slave-172 ~]# jps
在dev-spark-slave-171上啟動nodemanager
[root@dev-spark-slave-171 ~]# yarn-daemon.sh start nodemanager # 查看是否有 NodeManager的進程 [root@dev-spark-slave-171 ~]# jps
在dev-spark-master-206上,啟動nodemanager
[root@dev-spark-master-206 hadoop-3.2.2]# yarn-daemon.sh start nodemanager # jps查看是否有 NodeManager的進程 [root@dev-spark-master-206 hadoop-3.2.2]# jps
方式二:集群群起
在master節點執行start-dfs.sh命令,它會啟動namenode,以及去workers文件中指定的節點中,啟動datanode
在dev-spark-master-206上啟動hdfs
# 不單個啟動,集群啟動 start-dfs.sh
在dev-spark-slave-172上啟動yarn
[root@dev-spark-slave-172 ~]# start-yarn.sh
注意:NameNode和ResourceManger不是在同一台機器,不能在NameNode上啟動 YARN,應該在ResouceManager所在的機器上啟動YARN。
注意:如果啟動報錯
# start-dfs.sh Starting namenodes on [dev-spark-master-206] 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 [dev-spark-slave-172] ERROR: Attempting to operate on hdfs secondarynamenode as root ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
對於start-dfs.sh和stop-dfs.sh文件,添加下列參數:
# vim sbin/start-dfs.sh # 頂部加上下面的配置 #!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root # vim sbin/stop-dfs.sh #!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
對於start-yarn.sh和stop-yarn.sh文件,添加下列參數:
# vim sbin/start-yarn.sh #!/usr/bin/env bash YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root # vim sbin/stop-yarn.sh #!/usr/bin/env bash YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
發送到其他節點:
rsync-script sbin/start-dfs.sh rsync-script sbin/stop-dfs.sh rsync-script sbin/start-yarn.sh rsync-script sbin/stop-yarn.sh
再啟動:(再啟動之前,需要使用jps查看之前殘存的進程,用kill殺掉)
# start-dfs.sh WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER. Starting namenodes on [dev-spark-master-206] Last login: Wed Sep 8 15:05:01 CST 2021 from 192.168.90.188 on pts/6 Starting datanodes Last login: Wed Sep 8 15:37:52 CST 2021 on pts/5 Starting secondary namenodes [dev-spark-slave-172] Last login: Wed Sep 8 15:37:54 CST 2021 on pts/5 dev-spark-slave-172: WARNING: /data/apps/hadoop-3.2.2/logs does not exist. Creating.
啟動yarn:
注意:NameNode和ResourceManger不是在同一台機器,不能在NameNode上啟動 YARN,應該
在ResouceManager所在的機器上啟動YARN。
# 在dev-spark-slave-172上面啟動yarn start-yarn.sh
3.7、Hadoop集群啟動停止命令匯總
1. 各個服務組件逐一啟動/停止
(1)分別啟動/停止HDFS組件
hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
(2)啟動/停止YARN
yarn-daemon.sh start / stop resourcemanager / nodemanager
2. 各個模塊分開啟動/停止(配置ssh是前提)常用
(1)整體啟動/停止HDFS
start-dfs.sh / stop-dfs.sh
(2)整體啟動/停止YARN
start-yarn.sh / stop-yarn.sh
3.8、web ui界面查看
web頁面查看:http://192.168.90.206:9870/
查看yarn:(注意地址是:192.168.90.172)
http://192.168.90.172:8088/
3.9、測試hdfs:
[root@dev-spark-master-206 ~]# hdfs dfs -mkdir -p /test/input [root@dev-spark-master-206 ~]# echo "test hdfs" >> test.txt [root@dev-spark-master-206 ~]# hdfs dfs -put test.txt /test/input [root@dev-spark-master-206 ~]# hdfs dfs -ls /test/input Found 1 items -rw-r--r-- 3 root supergroup 10 2021-09-08 16:53 /test/input/test.txt
web界面上有看到相關文件:
4、配置歷史服務器
在Yarn中運行的任務產生的日志數據不能查看,為了查看程序的歷史運行情況,需要配置一下歷史日志
服務器。具體配置步驟如下:
4.1. 配置mapred-site.xml
# cd /data/apps/hadoop-3.2.2/etc/hadoop/
# vi mapred-site.xml
<!-- 歷史服務器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>dev-spark-master-206:10020</value>
</property>
<!-- 歷史服務器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>dev-spark-master-206:19888</value>
</property>
4.2、配置日志的聚集
日志聚集:應用(Job)運行完成以后,將應用運行日志信息從各個task匯總上傳到HDFS系統上。
日志聚集功能好處:可以方便的查看到程序運行詳情,方便開發調試。
注意:開啟日志聚集功能,需要重新啟動NodeManager 、ResourceManager和 HistoryManager。
開啟日志聚集功能具體步驟如下:
配置yarn-site.xml
vim yarn-site.xml
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留時間設置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://dev-spark-master-206:19888/jobhistory/logs</value>
</property>
4.3、分發配置到其他節點:
rsync-script mapred-site.xml rsync-script yarn-site.xml
4.4、啟動history server
# 重啟yarn [root@dev-spark-slave-172 logs]# stop-yarn.sh [root@dev-spark-slave-172 logs]# start-yarn.sh # 啟動歷史服務器: [root@dev-spark-master-206 hadoop]# mapred --daemon start historyserver
4.5、web頁面查看:
查看地址:http://192.168.90.206:19888/jobhistory
5、測試wordcount
創建wc.txt文件
# vim wc.txt hadoop mapreduce yarn hdfs hadoop mapreduce mapreduce yarn hello hello hello
上傳到hdfs:/text/input目錄
# 如果目錄不存在,需要先創建 hdfs dfs -mkdir -p /test/input # 上傳 hdfs dfs -put wc.txt /test/input # 查看是否上傳成功 hdfs dfs -ls /test/input
執行WordCount程序
hadoop jar /data/apps/hadoop-3.2.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /test/input/wc.txt /wcoutput
運行成功,查看結果:
[root@dev-spark-master-206 hadoop]# hdfs dfs -ls /wcoutput Found 2 items -rw-r--r-- 3 root supergroup 0 2021-09-08 17:20 /wcoutput/_SUCCESS -rw-r--r-- 3 root supergroup 43 2021-09-08 17:20 /wcoutput/part-r-00000 [root@dev-spark-master-206 hadoop]# hdfs dfs -ls /wcoutput/part-r-00000 -rw-r--r-- 3 root supergroup 43 2021-09-08 17:20 /wcoutput/part-r-00000 [root@dev-spark-master-206 hadoop]# hdfs dfs -cat /wcoutput/part-r-00000 hadoop 2 hdfs 1 hello 3 mapreduce 3 yarn 2
web頁面查看歷史服務器:http://192.168.90.206:19888/jobhistory
點擊logs可以查看詳情:
日志詳情如下:






