準備工作
- VMware Workstation Pro(懂得都懂)
- jdk-8u401-linux-x64.tar.gz
- spark-3.2.1-bin-hadoop2.7.tgz
- hadoop-2.7.7.tar.gz
- CentOS-7-x86_64-Mini.iso
- ssh工具(MobaXterm_Personal、FinalShell等,Windows的cmd其實也行,我這裡用XTerminal)
資源網上都有,請自行搜尋下載
安裝虛擬機器
選擇建立新的虛擬機器
為了節省時間,這裡使用推薦,你有興趣,也可以自定義配置
選擇你下載好的centos映象
給虛擬機器取個名,這裡用HadoopSpark
20G夠用了,直接下一步,完成
直接回車確認安裝
出現這個,選擇中文(這裡安裝過程使用哪種語言,不是系統使用哪種語言)
選擇安裝位置,然後選擇完成,讓它自動配置
選擇網路和主機名,開啟乙太網開關,更改主機名並應用(這裡改了,進去就不用改了),完成配置
開始安裝,然後設定root使用者的密碼,提示密碼太短,點兩下完成就可以了。這裡就不再建立普通使用者了。最後靜待安裝完成
安裝成功,選擇重啟
輸入使用者密碼,登入成功
配置靜態IP
輸入ip addr
,檢視本機IP地址
開啟SSH工具,輸入IP地址、使用者名稱、密碼,完成連線
登入虛擬機器後,輸入yum update -y
更新一下yum
接著輸入yum install -y vim
安裝一下vim編輯器
接著開啟網路配置檔案修改為靜態IP,按i
進入編輯模式
vim /etc/sysconfig/network-scripts/ifcfg-ens33
!!!這裡不要照抄!!!,往下看
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="a33fe36d-dca4-4030-a614-668e080b0f92"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.116.142
NETMASK=255.255.255.0
GATEWAY=192.168.116.2
DNS1=144.144.144.144
DNS2=8.8.8.8
把BOOTPROTO
改為static
,
IPADDR
,根據閘道器改,閘道器再這裡看,只改第四段就行,不要和閘道器衝突
GATEWAY
改成你查到的,剩下的和我一樣就行
改好後,按一下鍵盤左上角Esc
,輸入:wq
,儲存退出
接著輸入systemctl restart network
,重啟一下網路,無報錯就行
這裡我改的和原來的IP地址一樣,所以沒有重新連線
然後用ping www.baidu.com
,看一下能否連線外網,我這裡是OK的
關閉防火牆
為什麼要關閉防火牆
在安裝Hadoop的過程中,關閉防火牆是一個常見的步驟。這是因為Hadoop需要在叢集的各個節點之間進行大量的網路通訊,包括資料的傳輸和任務的排程等。如果防火牆開啟,則會對這些網路通訊進行限制,導致Hadoop無法正常工作。
具體來說,防火牆通常會對以下幾個方面的網路通訊進行限制:
- 埠:Hadoop使用多個埠進行節點之間的通訊,包括資料傳輸、任務排程和節點管理等。如果防火牆關閉了這些埠,那麼這些網路通訊就無法建立。因此,我們需要關閉防火牆來確保這些埠的正常通訊。
- 協議:Hadoop使用的通訊協議有很多,包括TCP/IP、UDP等。如果防火牆關閉了某些協議,那麼這些通訊協議就無法透過防火牆進行傳輸。因此,我們需要關閉防火牆來確保這些通訊協議的正常傳輸。
- IP地址:Hadoop叢集中的節點可能使用不同的IP地址進行通訊。如果防火牆關閉了某些IP地址,那麼這些節點之間的通訊就無法建立。因此,我們需要關閉防火牆來確保這些IP地址的正常通訊。
綜上所述,關閉防火牆是為了確保Hadoop叢集中各個節點之間的網路通訊能夠正常建立,從而保證Hadoop的正常工作。
輸入下面命令關閉防火牆
systemctl stop firewalld//暫時關閉,重新開機會自啟
systemctl disable firewalld//永久關閉
firewall-cmd --state//檢視防火牆狀態
配置主機名與IP對映
編輯對應檔案
vim /etc/hosts
格式IP地址(空格)主機名
設定SSH免密登入
SSH免密登入的原理可以理解為:如果某機器A試圖要免密登入機器B,則需要在機器A上生成一個公鑰(id_rsa.pub)和一個私鑰(id_rsa),並將公鑰新增到機器B的許可權列(authorized_keys)中,這樣在機器A上透過SSH就可以免密登入機器B了。
設定SSH免密登入前,需要生成秘鑰,在主機中執行ssh-keygen -t rsa
命令生成金鑰,命令輸入後,一直回車同意,直到顯示金鑰資訊即為生成完畢。
複製公鑰
ssh-copy-id -i .ssh/id_rsa.pub 使用者名稱字@主機ip
由於偽分散式的SSH免密登入操作就是將目錄“.ssh/”下的公鑰“id-rsa.pub”新增到當前目錄的“.ssh/ authorized_keys”列表中。因此將公鑰(id_rsa.pub)複製到當前目錄的/ authorized_keys列表中,命令為cat id_rsa.pub >> authorized_keys
或ssh-copy-id -i .ssh/id_rsa.pub root@spark
,設定完成後透過執行ssh spark
測試是否免密成功,如果直接登入則設定成功,如果需要輸入密碼,則設定失敗。
中途需要輸入yes
完成確認,還要輸入密碼(這個密碼是對應主機的密碼)。也可以採用另一種方式,不需要這些操作
輸入ssh spark
測試一下,免密登入是否成功
安裝Java執行環境
建立一個資料夾,來存放我們的軟體
然後把我們下載好的jdk上傳到虛擬機器,用SSH工具可以直接拖進去
純命令也行的
scp 本地路徑 使用者名稱@IP地址:虛擬機器路徑
解壓一下,並重新命名為Java
tar -zxvf jdk-8u401-linux-x64.tar.gz
mv jdk1.8.0_401 java
配置Java環境變數
vim /etc/profile
在末尾新增,路徑填寫你的具體路徑
export JAVA_HOME=/root/apps/java
export PATH=$PATH:$JAVA_HOME/bin
重新整理配置,是配置生效
source /etc/profile
檢視Java是否安裝成功
java -version
安裝Hadoop
老規矩,上傳、解壓、改名
tar -zxvf hadoop-2.7.7.tar.gz
mv hadoop-2.7.7 hadoop
配置環境變數,重新整理配置
vim /etc/profile
export HADOOP_HOME=/root/apps/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
檢驗是否安裝成功hadoop version
修改Hadoop核心配置檔案
Hadoop的配置檔案有多個,包括hadoop-env.sh、yarn-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml和yarn-site.xml,所有的配置檔案均存放於同一個目錄(/root/apps/hadoop/etc/hadoop)。
修改hadoop-env.sh檔案
cd hadoop/etc/hadoop/
hadoop-env.sh配置檔案主要是用來配置Hadoop執行所需的環境變數,主要是配置Java的環境變數。在此配置檔案中修改JAVA_HOME的配置資訊,將原來的值改為Java執行環境的安裝路徑
修改core-site.xml檔案
core-site.xml檔案是Hadoop核心全域性配置檔案,主要用於定義檔案訪問的格式。該檔案主要配置檔案系統採用hdfs實現、臨時資料存放的位置、緩衝區大小(實際工作中根據伺服器效能動態調整)、開啟hdfs的垃圾桶機制(刪除掉的資料可以從垃圾桶中回收,單位分鐘)等
<configuration>
<!--定義檔案系統的實現,預設是file:///本地檔案系統,改成 hdfs://分散式檔案儲存系統,指定HDFS的namenode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://spark:9000</value>
</property>
<!--Hadoop本地儲存臨時資料的目錄,如果hdfs-site.xml中不配置namenode和datanode的存放位置,預設就放在這個路徑中-->
<property>
<name>hadoop.tmp.dir</name>
<value>/root/apps/hadoop/tmp</value>
</property>
</configuration>
修改hdfs-site.xml檔案
此檔案是HDFS相關的配置檔案,用於配置Hadoop本地儲存Namenode和Datanode資料的目錄,配置副本的數量。
<configuration>
<property>
<!--配置HDFS儲存資料的副本數量,預設值是3,偽分散式設定為1-->
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<!--配置NameNode後設資料儲存路徑-->
<name>dfs.namenode.name.dir</name>
<value>file:/root/apps/hadoop/data/dfs/name</value>
</property>
<!--配置datanode中資料儲存位置-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/apps/hadoop/data/dfs/data</value>
</property>
</configuration>
啟動HDFS
經過以上操作,偽分散式HDFS搭建完成,在第一次啟動HDFS之前需要透過執行命令hdfs namenode -format
進行格式化。 此命令hdfs叢集配置過程只執行一次
HDFS格式完成後,透過執行命令start-dfs.sh
啟動服務程序。執行完成後透過jps檢視程序,如果出現NameNode、DataNode、SecondaryNameNode則表示HDFS偽分散式環境搭建成功
一路yes就行
備註:要停止HDFS,直接執行stop-dfs.sh即可
配置偽分散式YARN
YARN的配置檔案也存放於/root/apps/hadoop/etc/hadoop
目錄下,包括mapred-site.xml、yarn-site.xml、yarn-env.sh三個檔案
修改mapred-site.xml檔案
mapred-site.xml檔案預設情況下不存在,需要透過mapred-site.xml.template檔案建立一份
cp mapred-site.xml.template mapred-site.xml
執行命令vim mapred-site.xml
,在mapred-site.xml中新增如下內容。
<configuration>
<property>
<!--指定Mapreduce程式排程在yarn上,預設是local就是本地模式-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改yarn-site.xml
yarn-site.xml檔案是YARN框架的配置檔案,需配置YARN程序及YARN相關屬性。首先,需要指定ResourceManager守護程序的主機和監聽的埠,其主機為spark,預設埠為8032。其次,指定ResourceManager使用的scheduler以及NodeManager的輔助服務等資訊。在yarn-site.xml中新增如下內容。
<configuration>
<!--配置ResourceManager在哪臺機器上-->
<property>
<name>yarn.resourcemanager.name</name>
<value>spark</value>
</property>
<!--配置在NodeManager中執行MapReduce服務-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
修改yarn-env.sh
yarn-env.sh檔案是YARN框架執行環境的配置,同樣需要修改JAVA_HOME的配置資訊
把前面的#號去掉
好像不該也行,下面寫著如果為空則從環境變數裡取
啟動測試YARN
經過以上操作,偽分散式YARN搭建完成,透過執行命令start-yarn.sh
啟動服務程序,執行完成後透過jps檢視程序,如果出現ResourceManager和NodeManager程序則表示YARN偽分散式環境搭建成功
備註:要停止YARN,直接執行stop-yarn.sh即可。
透過Web瀏覽器訪問Hadoop的叢集環境
開啟瀏覽器,輸入http://192.168.116.142:50070
(其中URL中的IP地址及叢集伺服器的靜態IP),檢查NameNode和DataNode的啟動情況。見圖,說明HDFS啟動成功。
在瀏覽器中輸入http://192.168.116.142:8088
,檢查YARN的啟動情況,見圖,說明YARN啟動成功
安裝Spark
一樣的,上傳、解壓、重新命名(好累啊/(ㄒoㄒ)/~~)
tar -zxvf spark-3.2.1-bin-hadoop2.7.tgz
mv spark-3.2.1-bin-hadoop2.7 spark
配置環境變數
vim /etc/profile
export SPARK_HOME=/home/hadoop/apps/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
別忘了重新整理一下配置source /etc/profile
修改Spark配置檔案
Spark部署相對Hadoop比較簡單,只需要修改conf目錄下的spark-env.sh、spark-defaults.conf和workers(低版本的是slaves)檔案。
cd spark/conf/
複製一份
cp spark-env.sh.template spark-env.sh
執行vim spark-env.sh
命令在檔案中新增如下內容
export JAVA_HOME=/root/apps/java
export SPARK_MASTER_HOST=spark
export SPARK_MASTER_PORT=7077
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=10 -Dspark.history.fs.logDirectory=hdfs://spark:9000/spark"
export HADOOP_HOME=/root/apps/hadoop
export HADOOP_CONF_DIR=/root/apps/hadoop/etc/hadoop
複製一份
cp spark-defaults.conf.template spark-defaults.conf
執行vim spark-defaults.conf
命令在檔案中新增如下內容
spark.eventLog.enabled true
spark.eventLog.dir hdfs://spark:9000/spark
spark.eventLog.compress true
在HDFS中建立spark.eventLog.dir指定的目錄
hdfs dfs -mkdir /spark
hdfs dfs -ls /
也可以在webUI裡檢視
啟動spark和historyServer
由於Hadoop裡也有start-all.sh
,所以這裡給它改個名start-spark.sh
mv start-all.sh start-spark.sh
mv stop-all.sh stop-spark.sh
分別執行start-spark.sh
和start-history-server.sh
命令
測試Spark安裝情況
透過jps命令檢視相關程序,如果有Master、Worker和HistoryServer三個程序則叢集環境部署成功。
透過Web UI檢視Spark叢集(在瀏覽器輸入ip:8080和ip:18080)
提交一個程式
專案結構,其中用到了Scala語言,關於它的配置,請自行查閱
maven的pom檔案,編譯外掛時必須的,不然打包不進去
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.king</groupId>
<artifactId>Spark</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>wordCount</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.5.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
單詞計數程式碼
package com.king
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
val context = new SparkContext(conf)
val value = context.textFile(args(0))
val value1 = value.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
value1.saveAsTextFile(args(1))
context.stop()
}
}
上傳到虛擬機器
建立一個word.txt檔案vim word.txt
,內容如下
java python c c++ c# javascript
mysql java c hadoop c mtsql python
Hbash java scala hadoop spark
spark spark scala
上傳到hdfs
hdfs dfs -put ./word.txt /
hdfs dfs -ls /
提交程式到spark
spark-submit --master spark://spark:7077 --deploy-mode client --class com.king.WordCount ./wordCount-1.0-SNAPSHOT.jar hdfs://spark:9000/word.txt hdfs://spark:9000/result
可以看到結果已經出來了,只展示了一部分
spark這邊也有記錄
歷史也有
結束語
終於結束了,啊啊啊啊啊啊啊啊啊啊啊啊😫
累計花費四個小時,太難了