Spark常用三種運行模式
Spark 的運行模式有 Local(也稱單節(jié)點模式),Standalone(集群模式),Spark on Yarn(運行在Yarn上),Mesos以及K8s等常用模式,本文介紹前三種模式。
Spark-shell 參數(shù)
Spark-shell 是以一種交互式命令行方式將Spark應用程序跑在指定模式上,也可以通過Spark-submit提交指定運用程序,Spark-shell 底層調(diào)用的是Spark-submit,二者的使用參數(shù)一致的,通過- -help 查看參數(shù):
-master: 指定運行模式,spark://host:port, mesos://host:port, yarn, or local[n].
-deploy-mode: 指定將driver端運行在client 還是在cluster.
-class: 指定運行程序main方法類名,一般是應用程序的包名+類名
-name: 運用程序名稱
-jars: 需要在driver端和executor端運行的jar,如mysql驅(qū)動包
-packages: maven管理的項目坐標GAV,多個以逗號分隔
-conf: 以key=value的形式傳入sparkconf參數(shù),所傳入的參數(shù)必須是以spark.開頭
-properties-file: 指定新的conf文件,默認使用spark-default.conf
-driver-memory:指定driver端運行內(nèi)存,默認1G
-driver-cores:指定driver端cpu數(shù)量,默認1,僅在Standalone和Yarn的cluster模式下
-executor-memory:指定executor端的內(nèi)存,默認1G
-total-executor-cores:所有executor使用的cores
-executor-cores: 每個executor使用的cores
-driver-class-path: driver端的classpath
-executor-class-path:executor端的classpath
sparkconf的傳入有三種方式:
1.通過在spark應用程序開發(fā)的時候用set()方法進行指定
2.通過在spark應用程序提交的時候用過以上參數(shù)指定,一般使用此種方式,因為使用較為靈活
3.通過配置spark-default.conf,spark-env.sh文件進行指定,此種方式較shell方式級別低
Local模式
Local 模式是最簡單的一種Spark運行方式,它采用單節(jié)點多線程(cpu)方式運行,local模式是一種OOTB(開箱即用)的方式,只需要在spark-env.sh導出JAVA_HOME,無需其他任何配置即可使用,因而常用于開發(fā)和學習
方式:./spark-shell - -master local[n] ,n代表線程數(shù)
Standalone模式
- Spark可以通過部署與Yarn的架構(gòu)類似的框架來提供自己的集群模式,該集群模式的架構(gòu)設計與HDFS和Yarn大相徑庭,都是由一個主節(jié)點多個從節(jié)點組成,在Spark 的Standalone模式中,主,即為master;從,即為worker.
- Standalone集群模式通過配置spark-env.sh和slaves文件來部署,可以通過以下配置
1. vi spark-env.sh
2. SPARK_MASTER_HOST=192.168.137.200 ##配置Master節(jié)點
3. SPARK_WORKER_CORES=2 ##配置應用程序允許使用的核數(shù)(默認是所有的core)
4. SPARK_WORKER_MEMORY=2g ##配置應用程序允許使用的內(nèi)存(默認是一個G)
5. vi slaves
6. 192.168.137.200
7. 192.168.137.201
8. 192.168.137.202
- 啟動集群
1. sbin/start-all.sh
Spark on Yarn
簡而言之,Spark on Yarn 模式就是將Spark應用程序跑在Yarn集群之上,通過Yarn資源調(diào)度將executor啟動在container中,從而完成driver端分發(fā)給executor的各個任務。將Spark作業(yè)跑在Yarn上,首先需要啟動Yarn集群,然后通過spark-shell或spark-submit的方式將作業(yè)提交到Y(jié)arn上運行。
提交作業(yè)之前需要將HADOOP_CONF_DIR或YARN_CONF_DIR配置到Spark-env.sh中:
1. vi spark-env.sh
2. HADOOP_CONF_DIR=/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
on Yarn的倆種模式
- Yarn的倆種模式:一種為 client;一種為 cluster,可以通過- -deploy-mode 進行指定,也可以直接在 - -master 后面使用 yarn-client和yarn-cluster進行指定
-
倆種模式的區(qū)別:在于driver端啟動在本地(client),還是在Yarn集群內(nèi)部的AM中(cluster)
image.png
客戶端的Driver將應用提交給Yarn后,Yarn會先后啟動ApplicationMaster和excutor,另外ApplicationMaster和executor都裝在在container里運行,container默認的內(nèi)存是1g,ApplicationMaster分配的內(nèi)存是driver-memory,executor分配的內(nèi)存是executor-memory.同時,因為Driver在客戶端,所以程序的運行結(jié)果可以在客戶端顯示,Driver以進程名為SparkSubmit的形式存在。
Cluster 模式

1.由client向ResourceManager提交請求,并上傳Jar到HDFS上
這期間包括四個步驟:
a).連接到RM
b).從RM ASM(applicationsManager)中獲得metric,queue和resource等信息。
c).upload app jar and spark-assembly jar
d).設置運行環(huán)境和container上下文
2.ResourceManager向NodeManager申請資源,創(chuàng)建Spark ApplicationMaster(每個SparkContext都有一個ApplicationManager)
3.NodeManager啟動Spark App Master,并向ResourceManager ASM注冊
4.Spark ApplicationMaster從HDFS中找到jar文件,啟動DAGScheduler和YARN Cluster Scheduler
5.ResourceManager向ResourceManager ASM注冊申請container資源(INFO YarnClientImpl: Submitted application)
6.ResourceManager通知NodeManager分配Container,這是可以收到來自ASM關(guān)于container的報告。(每個container的對應一個executor)
7.Spark ApplicationMaster直接和container(executor)進行交互,完成這個分布式任務。
spark standalone 模式
進入spark安裝目錄下的conf文件夾
[atguigu@hadoop102 module] mv slaves.template slaves
[atguigu@hadoop102 conf] vim slaves
hadoop102
hadoop103
hadoop104
4)修改spark-env.sh文件,添加如下配置:
[atguigu@hadoop102 conf]$ vim spark-env.sh
SPARK_MASTER_HOST=hadoop102
SPARK_MASTER_PORT=7077
5)分發(fā)spark包
[atguigu@hadoop102 module] sbin/start-all.sh
注意:如果遇到 “JAVA_HOME not set” 異常,可以在sbin目錄下的spark-config.sh 文件中加入如下配置:
export JAVA_HOME=XXXX
官方求PI案例
spark-submit
--class org.apache.spark.examples.SparkPi
--master spark://server-2:7077
--executor-memory 1G
--total-executor-cores 2
/home/xxx/software/spark-2.4.4-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.4.jar
100
啟動spark shell
spark-shell
--master spark://server-2:7077
--executor-memory 1g
--total-executor-cores 2
spark-shell --master spark://server-2:7077 --executor-memory 1g --total-executor-cores 2
參數(shù):--master spark://server-2:7077指定要連接的集群的master
Yarn模式(重點)
Spark客戶端直接連接Yarn,不需要額外構(gòu)建Spark集群。有yarn-client和yarn-cluster兩種模式,主要區(qū)別在于:Driver程序的運行節(jié)點。
yarn-client:Driver程序運行在客戶端,適用于交互、調(diào)試,希望立即看到app的輸出
yarn-cluster:Driver程序運行在由RM(ResourceManager)啟動的AP(APPMaster)適用于生產(chǎn)環(huán)境。

安裝使用
1)修改hadoop配置文件yarn-site.xml,添加如下內(nèi)容:
[atguigu@hadoop102 hadoop]$ vi yarn-site.xml
<!--是否啟動一個線程檢查每個任務正使用的物理內(nèi)存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否啟動一個線程檢查每個任務正使用的虛擬內(nèi)存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
2)修改spark-env.sh,添加如下配置:
[atguigu@hadoop102 conf]$ vi spark-env.sh
YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
3)分發(fā)配置文件
[atguigu@hadoop102 conf] xsync spark-env.sh
4)執(zhí)行一個程序
spark-submit
--class org.apache.spark.examples.SparkPi
--master yarn
--deploy-mode client
/home/xxx/software/spark-2.4.4-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.4.jar
100
注意:在提交任務之前需啟動HDFS以及YARN集群。
日志查看
修改配置文件spark-defaults.conf
添加如下內(nèi)容:
spark.yarn.historyServer.address=server-2:18080
spark.history.ui.port=18080
2)重啟spark歷史服務
[atguigu@hadoop102 spark] sbin/start-history-server.sh
starting org.apache.spark.deploy.history.HistoryServer, logging to /opt/module/spark/logs/spark-atguigu-org.apache.spark.deploy.history.HistoryServer-1-hadoop102.out
3)提交任務到Y(jié)arn執(zhí)行
spark-submit
--class org.apache.spark.examples.SparkPi
--master yarn
--deploy-mode client
/home/xxx/software/spark-2.4.4-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.4.jar
100
