1. 程式人生 > 實用技巧 >VMware虛擬機器搭建Spark叢集

VMware虛擬機器搭建Spark叢集

目錄

一、搭建方法

在虛擬機器上搭建叢集的方法通常有兩種
1.類似於真實的機器上部署,首先要進行金鑰授權使各臺機器之間能夠免密碼相互訪問,然後在主節點上將各個軟體配置好,分發各個從節點。
2.採用虛擬機器克隆的方式,先進行軟體的配置,然後將master的公鑰授權自己,這樣克隆出來的多個虛擬機器之間都能夠免密碼登入
本文采用虛擬機器克隆的方式建立Spark叢集,其他的方式也是與這種方式類似

二、準備

物理機是win10作業系統,首先需要VMware軟體,擬搭建具有三個節點的Spark叢集,三臺主機名名別是master, slave1, slave2
所需要使用的軟體及版本

  • Ubuntu 14.04
  • jdk-8u221 (強烈建議不要使用最新版jdk, 使用jdk8)
  • Scala 2.13.1
  • Hadoop 3.2.1
  • spark-2.4.4-bin-hadoop2.7.tgz

三、系統環境配置

這部分也是準備工作,包括
1.新建名為hadoop的使用者,並建立密碼,新增管理員許可權
2.金鑰授權,可以讓叢集的所有節點相互免密訪問
3.修改主機名
4.主機名對映為IP,因為在軟體的配置過程當中,通常會使用主機名,而不是直接使用IP,所以採用主機名和IP繫結的方式能夠更方便的進行修改以適應各種環境。

操作步驟
1.新建使用者,命令如下:

sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
sudo adduser hadoop sudo

完成之後,需要登出當前使用者,使用hadoop使用者登入
2.金鑰授權,首先要安裝openssh-server,然後生成公鑰,將公鑰新增進授權認證檔案

sudo apt-get install openssh-server
cd ~/.ssh/
ssh-keygen -t rsa
cat id_rsa.pub >> authorized_keys

3.修改主機名

sudo vim /etc/hostname

將主機名修改為master,之後克隆的主機名分別改為slave1slave2
4.主機名與ip繫結,當然這一步在最後做,因為現在還沒有克隆虛擬機器,只有一臺master機器。
首先通過ifconfig

命令檢視當前IP,然後編輯hosts檔案

sudo vim /etc/hosts

我新增的內容如下

# Spark group
192.168.40.128 master
192.168.40.129 slave1
192.168.40.130 slave2

四、軟體安裝與配置

1. 軟體下載安裝

Java下載安裝
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 中下載JDK8,下載完解壓到/home/hadoop/Spark目錄下並重命名,這個目錄就作為整個Spark叢集的工作空間
命令如下:

tar -zxf ~/Downloads/jdk-8u221-linux-x64.tar.gz -C ~/Spark
cd ~/Spark
mv jdk1.8.0_221 JDK

然後配置環境變數,命令為sudo vim /etc/profile,新增內容如下

export WORK_SPACE=/home/hadoop/Spark/
export JAVA_HOME=$WORK_SPACE/JDK/
export JRE_HOME=$WORK_SPACE/JDK/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib

Scala, Hadoop, Spark下載安裝的方式相同,完成之後結果如下

hadoop@master:~/Downloads$ ls ~/Spark
hadoop  JDK  scala  spark

/etc/profile的內容如下

export WORK_SPACE=/home/hadoop/Spark/
export JAVA_HOME=$WORK_SPACE/JDK/
export JRE_HOME=$WORK_SPACE/JDK/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export SCALA_HOME=$WORK_SPACE/scala
export PATH=$PATH:$SCALA_HOME/bin
export SPARK_HOME=/home/hadoop/Spark/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

配置完之後可以通過java -version命令和 scala -version命令驗證是否配置正確。

2.Hadoop配置

這部分配置需要配置7個檔案,在 home/hadoop/Spark/hadoop/etc/hadoop/ 目錄下,分別是
hadoop-env.sh //BASH指令碼,配置需要的環境變數,以執行Hadoop,這裡配置Java路徑
yarn-env.sh //BASH指令碼,配置需要的環境變數,以執行YARN,這裡配置Java路徑
workers //配置從節點 可以是主機名或者IP地址 這個檔案在Hadoop舊版本檔名可能為slaves,新版本改為了workers
core-site.xml //Hadoop Core的配置項,例如HDFS、MapReduce和YARN常用的I/O設定等
hdfs-site.xml //Hadoop守護程序的配置項,包括namenode、輔助namenode和datanode等
maprd-site.xml //MapReduce守護程序的配置項,包括作業歷史伺服器
yarn-site.xml //YARN守護程序的配置項,包括資源管理器、web應用代理伺服器和節點管理器

詳細配置如下
1.hadoop-env.sh

export JAVA_HOME=/home/hadoop/Spark/JDK

2.yatn-env.sh

export JAVA_HOME=/home/hadoop/Spark/JDK

3.workers

master
slave1
slave2

4.core-site.xml

<configuration>
	<property>
        <name>fs.defaultFS</name>
        <!-- HDFS的名稱節點的地址 主機是NameNode的主機名稱或IP地址,埠是NameNode監聽RPC的埠,如果沒有指定,預設是8020 -->
        <value>hdfs://master:9000/</value>
    </property>
    <property>
		<name>hadoop.tmp.dir</name>
        <!-- 臨時目錄 -->
		<value>file:/home/hadoop/Spark/hadoop/tmp</value>
    </property>
</configuration>

5.hdfs-site.xml
首先要新建name和data目錄,命令為

$cd ~/Spark/hadoop
$mkdir dfs
$mkdir dfs/name
$mkdir dfs/data

然後配置xml檔案

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <!-- 第二名稱節點地址 -->
        <value>master:9001</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <!-- NameNode儲存永久性的元資料的目錄列表 -->
        <value>file:/home/hadoop/Spark/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <!-- data儲存永久性的元資料block塊的目錄列表 -->
        <value>file:/home/hadoop/Spark/hadoop/dfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <!-- 總結點數量 -->
        <value>3</value>
    </property>
    <property>
		<name>dfs.webhdfs.enabled</name>
		<!-- 開啟hdfs的web訪問介面。預設埠是50070-->
		<value>true</value>
	</property>
</configuration>

6.maprd-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <!-- 支援MapReduce執行的框架的名稱 -->
        <value>yarn</value>
    </property>
</configuration>

7.yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <!-- 節點管理器執行的附加服務列表 預設情況下,不指定附加服務-->預設情況下,不指定附加服務
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <!-- 執行資源管理器的PRC伺服器的主機名和埠。-->
        <value>master:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
		<!--yarn總管理器排程程式的IPC通訊地址-->
        <value>master:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <!--yarn總管理器的IPC通訊地址-->
        <value>master:8035</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <!--yarn總管理器的IPC管理地址-->
        <value>master:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <!--yarn總管理器的web http通訊地址-->
        <value>master:8088</value>
    </property>
</configuration>
3.Spark配置

Spark只需要配置兩個檔案分別是spark-env.shslaves,配置目錄在安裝目錄的conf資料夾內,為~/Spark/spark/conf
1.spark-env.sh

export JAVA_HOME=/home/hadoop/Spark/JDK
export SCALA_HOME=/home/hadoop/Spark/scala
export HADOOP_HOME=/home/hadoop/Spark/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_HOME=/home/hadoop/Spark/spark
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
#SPARK_LOCAL_IP為當前節點的IP,當克隆完虛擬機器後需要在其他機器上做修改
SPARK_LOCAL_IP=master
YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_DRIVER_MEMORY=512M
SPARK_MASTER_HOST=master
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=1
SPARK_WORKER_MEMORY=512M
SPARK_WORKER_PORT=7077

2.slaves

slave1
slave2

完成以上配置後,大部分工作已經完成,接下來只需要配置完Spark之後,就可以將這臺虛擬機器克隆出兩個從節點,配置hosts檔案,就可以啟動了。

五、虛擬機器克隆

將虛擬機器克隆之後,還需要做件事
1.修改克隆出的節點的主機名分別為slave1,slave2,命令為sudo vim /etc/hostname
2.通過ifconfig檢視每臺機器的IP,將主機名和IP繫結,命令為sudo vim /etc/hosts
3.修改Spark配置檔案spark-env.shSPARK_LOCAL_IP為當前機器的主機名

六、啟動叢集

以上步驟全部完成之後就可以啟動叢集了,依次啟動HDFS,YARN,Spark
1.啟動HDFS, 首先要格式化名稱節點,命令為sbin/hdfs namenode -format,然後啟動hdfs,啟動命令為 ~/Spark/hadoop/sbin/start-dfs.sh,啟動完成後,使用jps檢視啟動的程序
master上應該看到4個程序, 過程如下

hadoop@master:~$ ~/Spark/hadoop/sbin/start-dfs.sh
Starting namenodes on [master]
Starting datanodes
Starting secondary namenodes [master]
hadoop@master:~$ jps
3858 SecondaryNameNode
3638 DataNode
4008 Jps
3484 NameNode

在從節點上

hadoop@slave1:~$ jps
3099 Jps
2991 DataNode

2.啟動YARN框架,啟動命令為~/Spark/hadoop/sbin/start-yarn.sh
在master上應該看到6個程序,過程如下

hadoop@master:~$ ~/Spark/hadoop/sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers
hadoop@master:~$ jps
4145 ResourceManager
3858 SecondaryNameNode
4308 NodeManager
3638 DataNode
4651 Jps
3484 NameNode

在從節點上

hadoop@slave1:~$ jps
3191 NodeManager
3304 Jps
2991 DataNode

3.啟動Spark叢集,啟動命令為~/Spark/spark/sbin/start-all.sh
在master上過程如下

hadoop@master:~$ ~/Spark/spark/sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /home/hadoop/Spark/spark/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-master.out
slave1: starting org.apache.spark.deploy.worker.Worker, logging to /home/hadoop/Spark/spark/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-slave1.out
slave2: starting org.apache.spark.deploy.worker.Worker, logging to /home/hadoop/Spark/spark/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-slave2.out
hadoop@master:~$ jps
4145 ResourceManager
3858 SecondaryNameNode
4308 NodeManager
3638 DataNode
3484 NameNode
4749 Jps
4685 Master

從節點程序如下

hadoop@slave1:~$ jps
3191 NodeManager
3417 Jps
3371 Worker
2991 DataNode

至此,Spark叢集已經搭建完成。

七、踩坑經歷

1.先說最大的坑,JDK版本問題
我最初是從oracle官網下載的最新的JDK,也是就JDK13,啟動HDFS沒有問題,但是在啟動YARN時卻發生了問題,如下圖所示,啟動指令碼沒有報錯,但是resourcemanager和nodemanager並沒有被啟動。

最開始沒有報錯,於是我期初把這個問題忽視了,繼續啟動Spark,當然是怎麼也啟動不了,發生如下錯誤

於是百度查詢各種解決辦法無果。因為YARN沒有啟動,而Spark是執行在YARN之上的,所以當然無法啟動了
後來才想通是YARN的問題,於是查看了logs下的日誌,發現瞭如下圖的問題

無法呼叫javax.activation.DataSource, 然後繼續百度,據說了JDK9及以上的版本禁用了javax,解決辦法是解除安裝新版JDK,重新安裝JDK8,之後,終於順利啟動了,所以,一定要使用JDK8

2.啟動DFS後,沒有datanode
這個問題是由於在第一次格式化之後,啟動並使用了hadoop,後來又重新執行了格式化命令,這時namenode的clusterID會重新生成,而datanode的clusterID 保持不變,所以會導致datanode和namenode的clusterID不一致的問題,解決問題的辦法之一是更改dfs/data/current/VERSION中的ID與dfs/name/current/VERSION中的ID保持一致,當然還有一種解決辦法是刪除tmpdfs/namedfs/data三個目錄,然後重新建這三個目錄,然後格式化HDFS,再重新啟動。(當然使用這種方法一定要確認資料是否備份,否則自己手賤刪資料最後想剁手)

坑就寫這些吧,還有一些小坑簡單說一下,在配置xml檔案時,標籤內容的錯誤並不會報錯,所以一旦你自己手敲的過程,敲錯了一個字母,那麼很難檢查出來,所以建議,在有別人已經寫好的優秀的部落格的情況下不要自己手敲,能複製貼上就複製貼上。
另外一個經驗,出現錯誤不要第一時間百度,首先看日誌檔案,分析出錯的具體原因,因為不同的原因可能導致同一個錯誤,所以百度出來的解決辦法可能只適用別人,並不適合你遇到的問題。