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

四、軟件安裝與配置

a. 軟件下載安裝

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命令驗證是否配置正確。

b. 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>

c. 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文件時, 標簽內容的錯誤並不會報錯,所以一旦你自己手敲的過程,敲錯了一個字母,那么很難檢查出來,所以建議,在有別人已經寫好的優秀的博客的情況下不要自己手敲,能復制粘貼就復制粘貼。
另外一個經驗,出現錯誤不要第一時間百度,首先看日志文件,分析出錯的具體原因,因為不同的原因可能導致同一個錯誤,所以百度出來的解決辦法可能只適用別人,並不適合你遇到的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM