hadoop+spark偽分散式

星光辰枫發表於2024-04-12

28ffeb16803bb3ae21c49ae277e3f9fe

準備工作

  • 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)

資源網上都有,請自行搜尋下載

安裝虛擬機器

選擇建立新的虛擬機器

image-20240411202351607

為了節省時間,這裡使用推薦,你有興趣,也可以自定義配置

image-20240411202442802

選擇你下載好的centos映象

image-20240411202548387

給虛擬機器取個名,這裡用HadoopSpark

image-20240411202924550

20G夠用了,直接下一步,完成

image-20240411202957214

image-20240411203041234

直接回車確認安裝

image-20240411203159900

出現這個,選擇中文(這裡安裝過程使用哪種語言,不是系統使用哪種語言)

image-20240411203303533

選擇安裝位置,然後選擇完成,讓它自動配置

image-20240411203531137

image-20240411203559522

選擇網路和主機名,開啟乙太網開關,更改主機名應用(這裡改了,進去就不用改了),完成配置

image-20240411203747304

image-20240411203915612

開始安裝,然後設定root使用者的密碼,提示密碼太短,點兩下完成就可以了。這裡就不再建立普通使用者了。最後靜待安裝完成

image-20240411204140425

image-20240411204204814

image-20240411204239606

安裝成功,選擇重啟

image-20240411204707156

輸入使用者密碼,登入成功

image-20240411205004848

配置靜態IP

輸入ip addr,檢視本機IP地址

image-20240411205446175

開啟SSH工具,輸入IP地址、使用者名稱、密碼,完成連線

image-20240411205646537

登入虛擬機器後,輸入yum update -y更新一下yum

image-20240411210138550

接著輸入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

image-20240411211705979

IPADDR,根據閘道器改,閘道器再這裡看,只改第四段就行,不要和閘道器衝突

GATEWAY改成你查到的,剩下的和我一樣就行

image-20240411211919382

image-20240411211026890

image-20240411211055337

改好後,按一下鍵盤左上角Esc,輸入:wq,儲存退出

接著輸入systemctl restart network,重啟一下網路,無報錯就行

這裡我改的和原來的IP地址一樣,所以沒有重新連線

然後用ping www.baidu.com,看一下能否連線外網,我這裡是OK的

image-20240411212716727

關閉防火牆

為什麼要關閉防火牆

在安裝Hadoop的過程中,關閉防火牆是一個常見的步驟。這是因為Hadoop需要在叢集的各個節點之間進行大量的網路通訊,包括資料的傳輸和任務的排程等。如果防火牆開啟,則會對這些網路通訊進行限制,導致Hadoop無法正常工作。

具體來說,防火牆通常會對以下幾個方面的網路通訊進行限制:

  • 埠:Hadoop使用多個埠進行節點之間的通訊,包括資料傳輸、任務排程和節點管理等。如果防火牆關閉了這些埠,那麼這些網路通訊就無法建立。因此,我們需要關閉防火牆來確保這些埠的正常通訊。
  • 協議:Hadoop使用的通訊協議有很多,包括TCP/IP、UDP等。如果防火牆關閉了某些協議,那麼這些通訊協議就無法透過防火牆進行傳輸。因此,我們需要關閉防火牆來確保這些通訊協議的正常傳輸。
  • IP地址:Hadoop叢集中的節點可能使用不同的IP地址進行通訊。如果防火牆關閉了某些IP地址,那麼這些節點之間的通訊就無法建立。因此,我們需要關閉防火牆來確保這些IP地址的正常通訊。

綜上所述,關閉防火牆是為了確保Hadoop叢集中各個節點之間的網路通訊能夠正常建立,從而保證Hadoop的正常工作。

輸入下面命令關閉防火牆

systemctl stop firewalld//暫時關閉,重新開機會自啟
systemctl disable firewalld//永久關閉
firewall-cmd --state//檢視防火牆狀態

image-20240411213833089

配置主機名與IP對映

編輯對應檔案

vim /etc/hosts

格式IP地址(空格)主機名

image-20240411214218848

設定SSH免密登入

SSH免密登入的原理可以理解為:如果某機器A試圖要免密登入機器B,則需要在機器A上生成一個公鑰(id_rsa.pub)和一個私鑰(id_rsa),並將公鑰新增到機器B的許可權列(authorized_keys)中,這樣在機器A上透過SSH就可以免密登入機器B了。

設定SSH免密登入前,需要生成秘鑰,在主機中執行ssh-keygen -t rsa命令生成金鑰,命令輸入後,一直回車同意,直到顯示金鑰資訊即為生成完畢。

image-20240411214646155

複製公鑰

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_keysssh-copy-id -i .ssh/id_rsa.pub root@spark,設定完成後透過執行ssh spark測試是否免密成功,如果直接登入則設定成功,如果需要輸入密碼,則設定失敗。

中途需要輸入yes完成確認,還要輸入密碼(這個密碼是對應主機的密碼)。也可以採用另一種方式,不需要這些操作

image-20240411215717531

輸入ssh spark測試一下,免密登入是否成功

image-20240411215915708

安裝Java執行環境

建立一個資料夾,來存放我們的軟體

image-20240411220117675

然後把我們下載好的jdk上傳到虛擬機器,用SSH工具可以直接拖進去

image-20240411220353273

純命令也行的

scp 本地路徑 使用者名稱@IP地址:虛擬機器路徑

解壓一下,並重新命名為Java

tar -zxvf jdk-8u401-linux-x64.tar.gz
mv jdk1.8.0_401 java

image-20240411220914639

配置Java環境變數

vim /etc/profile

在末尾新增,路徑填寫你的具體路徑

export JAVA_HOME=/root/apps/java
export PATH=$PATH:$JAVA_HOME/bin

重新整理配置,是配置生效

source /etc/profile

檢視Java是否安裝成功

java -version

image-20240411221516114

安裝Hadoop

老規矩,上傳、解壓、改名

tar -zxvf hadoop-2.7.7.tar.gz
mv hadoop-2.7.7 hadoop

image-20240411223131885

配置環境變數,重新整理配置

vim /etc/profile
export HADOOP_HOME=/root/apps/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile

image-20240411223737304

檢驗是否安裝成功hadoop version

image-20240411223825274

修改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/

image-20240411224224441

hadoop-env.sh配置檔案主要是用來配置Hadoop執行所需的環境變數,主要是配置Java的環境變數。在此配置檔案中修改JAVA_HOME的配置資訊,將原來的值改為Java執行環境的安裝路徑

image-20240411224435834

修改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叢集配置過程只執行一次

image-20240411225419159

HDFS格式完成後,透過執行命令start-dfs.sh啟動服務程序。執行完成後透過jps檢視程序,如果出現NameNode、DataNode、SecondaryNameNode則表示HDFS偽分散式環境搭建成功

一路yes就行

image-20240411225648070

image-20240411225728365

備註:要停止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的配置資訊

把前面的#號去掉

image-20240411231152392

好像不該也行,下面寫著如果為空則從環境變數裡取

image-20240411231243136

啟動測試YARN

經過以上操作,偽分散式YARN搭建完成,透過執行命令start-yarn.sh啟動服務程序,執行完成後透過jps檢視程序,如果出現ResourceManager和NodeManager程序則表示YARN偽分散式環境搭建成功

image-20240411231604435

備註:要停止YARN,直接執行stop-yarn.sh即可。

透過Web瀏覽器訪問Hadoop的叢集環境

開啟瀏覽器,輸入http://192.168.116.142:50070(其中URL中的IP地址及叢集伺服器的靜態IP),檢查NameNode和DataNode的啟動情況。見圖,說明HDFS啟動成功。

image-20240411231855838

在瀏覽器中輸入http://192.168.116.142:8088,檢查YARN的啟動情況,見圖,說明YARN啟動成功

image-20240411232012279

安裝Spark

一樣的,上傳、解壓、重新命名(好累啊/(ㄒoㄒ)/~~)

tar -zxvf spark-3.2.1-bin-hadoop2.7.tgz
 mv spark-3.2.1-bin-hadoop2.7 spark

image-20240411235110721

配置環境變數

vim /etc/profile
export SPARK_HOME=/home/hadoop/apps/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin 

別忘了重新整理一下配置source /etc/profile

image-20240411235350082

修改Spark配置檔案

Spark部署相對Hadoop比較簡單,只需要修改conf目錄下的spark-env.sh、spark-defaults.conf和workers(低版本的是slaves)檔案。

cd spark/conf/

image-20240411235717110

複製一份

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 /

image-20240412001152722

也可以在webUI裡檢視

image-20240412001300525

image-20240412001314779

啟動spark和historyServer

由於Hadoop裡也有start-all.sh,所以這裡給它改個名start-spark.sh

image-20240412001544213

mv start-all.sh start-spark.sh
mv stop-all.sh stop-spark.sh

image-20240412001846096

分別執行start-spark.shstart-history-server.sh命令

image-20240412002243815

測試Spark安裝情況

透過jps命令檢視相關程序,如果有Master、Worker和HistoryServer三個程序則叢集環境部署成功。

image-20240412002346936

透過Web UI檢視Spark叢集(在瀏覽器輸入ip:8080和ip:18080)

image-20240412002504488

image-20240412002534383

提交一個程式

專案結構,其中用到了Scala語言,關於它的配置,請自行查閱

image-20240412003156133

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()
  }
}

image-20240412003604249

image-20240412003708086

上傳到虛擬機器

image-20240412003837181

建立一個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 /

image-20240412004540073

提交程式到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

image-20240412005237546

可以看到結果已經出來了,只展示了一部分

image-20240412005310117

image-20240412005445630

spark這邊也有記錄

image-20240412005551325

歷史也有

image-20240412005630978

image-20240412005708085

結束語

終於結束了,啊啊啊啊啊啊啊啊啊啊啊啊😫

累計花費四個小時,太難了

image-20240412005918165

image-20240412005934341

相關文章