1. 程式人生 > >Spark各種模式的環境搭建及相關工作流程介紹

Spark各種模式的環境搭建及相關工作流程介紹

1前言

本篇部落格主要記錄的是Spark的3種執行模式及對應的模式環境搭建過程和流程介紹。3種模式都是經過實踐記錄詳細的操作過程和注意事項。
在進行環境的配置過程中,建議先理解每個模式下的工作流程,然後再進行環境搭建,這樣容易加深理解。由於Spark on YARN是搭建在HDFS分散式環境下的,所以此處可以參考一下Hadoop環境搭建及相關元件的工作流程介紹進行環境搭建,對應的軟體下載地址密碼: k9ir

2Spark一些核心概念

Application: 使用者編寫的Spark應用程式,同等於MapReduce需要處理的一個或多個任務job。由Driver程式和Executor程式組成。
Driver:

執行Application的main函式並建立SparkContext,SparkContext的目的是為了準備Spark應用程式的執行環境。SparkContext負責資源的申請、任務分配和監控等。
Exector:為某Application而在Worker Node上執行的一個程序,負責執行Task。每個Application都有各自獨立的一批Executor。 在Spark on Yarn模式下,Exector的程序名稱為CoarseGrainedExecuor Backend,一個CoarseGrainedExecuor Backend程序有且只有一個Exector物件,負責將Task包裝成taskRunner,並從執行緒池中抽取出一個空閒執行緒執行Task.
Cluster Manager
:叢集管理器,指的是叢集上獲取資源的外部服務,主要要3種類型。
a.Standalone:spark原生的資源管理,由Master負責資源的分配。
b.Apache Mesos
c.Hadoop Yarn:主要指的是Yarn中的ResourceManager和NodeManager的資源管理排程框架。
Worker:叢集中可以執行Application程式碼的節點,類似於Yarn中的NodeManager節點。
Task:Application的執行基本單位,Executor上的工作單元,類似於MapReduce中的MapTask和ReduceTask。多個Task組成一個Stage,而Task的排程和管理由TaskSchedule負責。
Job
:包含多個Task組成的平行計算由Spark Action原子操作觸發產生,一個Application可以包含多個Job。每個Job包含多個Stage。
State:每個Job會拆分為多組Task,作為一個TaskSet,稱為Stage。Stage的劃分和排程有DAGScheduler負責。有Shuffle Map Stage和Result Stage兩種。
RDD:Spark基本計算單元,是Spark最核心的東西。主要有Transformation和Action操作。它是能夠被並行操作的資料集合。其儲存級別可以是記憶體,磁碟,可通過spark.storage.StorageLevel設定。
DAGScheduler:根據job構建基於Staged的DAG,並提交Stage給TaskSchedule。其劃分Stage的依據是RDD之間的依賴關係。
TaskScheduler:將TaskSet提交給Worder叢集執行,每個Exector執行上面Task就在此分配。

3Spark各個模式執行配置及詳細介紹

圖1
圖說明:上圖為Spark的基本執行流程圖,不管是Spark什麼模式執行,基本執行流程圖如上所示,可能發生變化的就是各個元件的存放的節點位置和稱呼不一樣,但基本功能和執行流程不變。涉及到的核心概念如上。
a.各個模式涉及到的變化

local: 上圖所有元件的執行都是在本地機上,且用執行緒的形式來完成分散式的任務。
Standalone: 需要將Spark部署到相關節點,需要指定master機器和Worder機器。此時的資源分配由master節點完成。
Yarn-Cluster: Driver和Exector都執行在Yarn叢集,此時Spark執行流程圖中的稱呼master和執行任務的Worder不在使用,而是NodeManager,資源分佈排程的是ResourceManager,且YARN中的運用程式管理ApplicationMaster管理Spark中的Driver,其中Driver在該ApplicationMaster的節點中。
Yarn-client:只有Exector執行在Yarn叢集上。此時Spark執行流程圖中的稱呼master和執行任務的Worder不在使用,而是NodeManager,資源分佈排程的是ResourceManager。此時YARN中的執行程式管理ApplicationMaster管理Spark中的Driver。其中Driver在Client的機器上。

b.spark各個模式下的應用程式的提交
兩種方式spark-shellspark-submit
說明:總的來說,最後提交方式都是通過spark-submit的方式來提交,spark-shell執行的時候先進行了一些初始化的配置,然後再通過spark-submit的方式來進行提交應用程式。不過spark-shell是互動式的方式來進行應用的提交。接下來對各個模式下的部署和驗證的例項使用spark-submit的方式進行。
參考:各個模式下的提交具體引數說明檢視地址
c.總的來說,Spark執行模式取決於傳遞個SparkContext的deplyModemaster 引數的設定。

--master+ 引數:local、yarn-client、yarn-cluster
--deploy-mode+引數:cluster、client

spark-submit提交示例:

在$SPARK_HOME目錄下:
命令:./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]
命令引數說明:
application-jar:為應用程式的jar包
application-arguments:為應用程式中的呼叫引數
3.1Spark 本地模式介紹

說明:所有程式都執行在一個JVM中,啟動提交應用程式後,會產生一個SparkSubmit程序,既是客戶提交任務的Client程序、又是Spark的driver程式、還充當著Spark執行Task的Executor角色。
軟體準備: jdk-8u171-linux-x64.tar.gz,scala-2.11.8.tgz,spark-2.2.0-bin-2.6.0-cdh5.7.0.tgz(這塊是自己編譯好的spark包)
情景說明: VM1(master)192.168.1.77上執行的和進行如下配置

步驟1:分別解壓到/home/zkpk/app/檔案下
步驟2:gedit /home/zkpk/.bash_profile
    #java
    export JAVA_HOME=/usr/java/jdk1.8.0_171
    export PATH=$JAVA_HOME/bin:$PATH

    #spark
    export SPARK_HOME=/home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0
    export PATH=$SPARK_HOME/bin:$PATH

    #scala
    export SCALA_PATH=/home/zkpk/app/scala-2.11.8
    export PATH=$SCALA_PATH/bin:$PATH

本地應用程式提交示例:終端的當前目錄是$SPARK_HOME

命令:./bin/spark-submit --class org.apache.spark.examples.JavaWordCount --master local /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/examples/jars/spark-examples_2.11-2.2.0.jar file:///home/zkpk/app/data/words.txt
結果:spark: 972
    hadoop: 1834
    li: 972
    welcome: 1836
    jian: 1944
或者命令:./bin/spark-shell --master local
接下來使用scala語言進行互動式的執行。
驗證檢視:http://localhost:4040
3.2Spark standalone模式介紹

說明:叢集模式為1 master + n worker。
前提:叢集的網路主機名,hosts都已經設定好了。
情景:3臺VM虛擬機器

VM1主機名master,ip:192.168.1.77,充當standalon叢集中的master,worker
VM2主機名slave1,ip:192.168.1.103,充當standalon叢集中的worker.
VM3主機名slave2,ip:192.168.1.102,充當standalon叢集中的worker.
各個VM的java版本是:jdk1.8.0_171
Scala版本是:scala-2.11.8
Spark版本是:spark-2.2.0-bin-2.6.0-cdh5.7.0

方法是:先配置好Master上的再複製到其他的主機上

1.配置$SPARK_HOME/conf/spark-env.sh(master)

命令:cp /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-env.sh.template /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-env.sh
命令:gedit /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-env.sh
    JAVA_HOME=/usr/java/jdk1.8.0_171
    SCALA_HOME=/home/zkpk/app/scala-2.11.8
    SPARK_MASTER_HOST=master #設定spark的master主機,重要
    SPARK_WORKER_CORES=2    #設定每個worker的核數
    SPARK_WORKER_MEMORY=2g
    SPARK_WORKER_INSTANCES=1 #每個節點的worker 程序數量

2.設定$SPARK_HOME/conf/spark-env.sh/slaves(master)
主要是設定sparkd的從節點主機名

命令:cp /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/slaves.template /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/slaves
命令:gedit /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/slaves
    master
    slave1
    slave2

3.將Master的叢集配置複製到其他節點

命令:scp -r /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0 zkpk@slave1:/home/zkpk/app/
命令:scp -r /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0 zkpk@slave2:/home/zkpk/app/
命令:scp -r /home/zkpk/app/scala-2.11.8 zkpk@slave1:/home/zkpk/app/
命令:scp -r /home/zkpk/app/scala-2.11.8 zkpk@slave2:/home/zkpk/app/
複製配置檔案:
命令:scp /home/zkpk/.bash_profile zkpk@slave1:/home/zkpk/.bash_profile
命令:scp /home/zkpk/.bash_profile zkpk@slave2:/home/zkpk/.bash_profile
再到各個主機slave1和slave2的主機下的終端分別執行:
命令:source /home/zkpk/.bash_profile

4.啟動spark叢集

命令:/home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/sbin/start-all.sh
start-all.sh該指令碼的工作:會在master機器上啟動master程序,在$SPARK_HOME/conf/slaves檔案配置的所有hostname的機器上啟動worker程序。
瀏覽器檢視:master:8080
或者命令檢視:jps
或者啟動方式:
命令:/home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/sbin/start-master.sh
命令:/home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/sbin/start-slaves.sh

5.應用程式提交示例

命令:spark-submit --class org.apache.spark.examples.JavaWordCount --master spark://master:7077 /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/examples/jars/spark-examples_2.11-2.2.0.jar file:///home/zkpk/app/data/words.txt
結果:
spark: 972
hadoop: 1834
li: 972
welcome: 1836
jian: 1944
注意:這裡的file:///home/zkpk/app/data/words.txt檔案存放在master節點上,需要複復制存放到各個節點的相同目錄檔案下,不過由於master VM 本身也是worker所以如果只放在master上也是能執行出結果的。所以這時候需要使用到hadoop HDFS檔案系統,將更好。

6.standalone模式下的執行流程圖
圖2

3.3Spark YARN模式介紹

說明:此模式需要建立在Hadoop叢集上,檔案儲存於HDFS上,資源排程YARN,平行計算框架Spark.
此時Spark叢集並不在是master和n個worker的形式,資源排程上是1個ResourceManager和n個NodeManager,檔案系統是NameNode和DataNode的形式。Spark YARN模式有兩種形式Client和叢集模式。
前提:叢集的網路主機名,hosts都已經設定好了,Window有3個VM和Mac同處一個區域網下,VM採用橋接模式。
情景:3臺VM虛擬機器(Windows上)。

VM1主機名master,ip:192.168.1.77,HDFS中的NameNode和DataNode,YARN中的ResourceManager和NodeManager。
VM2主機名slave1,ip:192.168.1.103,HDFS中的DataNode,YARN中的NodeManager。
VM3主機名slave2,ip:192.168.1.102,HDFS中的DataNode,YARN中的NodeManager。
各個VMjava版本是:jdk1.8.0_171
Scala版本是:scala-2.11.8
Spark版本是:spark-2.2.0-bin-2.6.0-cdh5.7.0

1.設定spark-env.sh,各個節點下都需要設定好

命令:cp /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-env.sh.template /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-env.sh
命令:gedit /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf/spark-env.sh
      HADOOP_HOME=/home/zkpk/app/hadoop
      HADOOP_CONF_DIR=/home/zkpk/app/hadoop/etc/hadoop

2.HDFS上述要求的分散式環境搭建
參考上篇部落格Hadoop環境搭建及相關元件的工作流程介紹
,其中需要注意的是java環境已經換成1.8了,相應的地方需要更改$HADOOP_HOME/etc/hadoop/hadoop-env.sh中的java環境地址。
需要注意修改的地方是$HADOOP_HOME/etc/hadoop/yarn-site.xml(每個節點都需要修改)

命令:gedit $HADOOP_HOME/etc/hadoop/yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle,spark_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
        <value>org.apache.spark.network.yarn.YarnShuffleService</value>
    </property>
    <property>
        <name>spark.shuffle.service.port</name>
        <value>7338</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
</configuration>
注意:為避免NodeManger啟動不了,各個節點需要拷貝${SPARK_HOME}/yarn/spark-2.2.0-yarn-shuffle.jar”到“${HADOOP_HOME}/share/hadoop/yarn/lib/”目錄下

3.啟動Spark on Yarn(master節點下)

1,首先啟動Hadoop分散式。
命令:$HADOOP_HOME/sbin/start-all.sh
此時檢視執行的程序命令:jps
有:NodeManager,NameNode,Jps,DataNode,ResourceManager
瀏覽器端檢視:http://master:50070 ->HDFS檔案
            http://master:8088 ->執行排程
2.關閉任務:$HADOOP_HOME/sbin/stop-all.sh

4.應用程式提交示例,Spark on Yarn執行模式有兩種執行情況。
a.spark on yarn-client模式
driver執行在提交作業的機器上(可以看到程式列印日誌)

命令:spark-submit --class org.apache.spark.examples.JavaWordCount --master yarn --deploy-mode client /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/examples/jars/spark-examples_2.11-2.2.0.jar hdfs://192.168.1.77:8020/words.txt

執行流程如下(摘自網上):
圖4
b.spark on yarn-cluster模式
driver執行在叢集上某個機器上(看不到日誌,只可以看到running狀態),Driver在AppMaster執行.

命令:spark-submit --class org.apache.spark.examples.JavaWordCount --master yarn --deploy-mode cluster /home/zkpk/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/examples/jars/spark-examples_2.11-2.2.0.jar hdfs://192.168.1.77:8020/words.txt

執行流程如下(摘自網上):
圖5

4問題

描述: HDFS分散式啟動問題,有時候DataNode能啟動,NameNode不能啟動,有時候剛好相反。
解決:清空hadoop HDFS設定的tmp資料夾,清空logs資料夾。再格式化HDFS,最後啟動,問題能解決。
指令碼

#我的Hadoop home目錄為/home/zkpk/app/hadoop
cd /home/zkpk/app
rm -r ./hadoop_tmp/
echo 'delete tmp ~'
rm -r ./hadoop/logs/
echo 'delete logs ~'
mkdir -p ./hadoop_tmp/dfs/data
mkdir -p ./hadoop_tmp/dfs/name
hdfs namenode -format
/home/zkpk/app/hadoop/sbin/start-dfs.sh