Spark有多种运行模式,包括——
本文主要介绍前面三种最常用的运行模式,其中每种模式又可细分为两种模式。在搭建好集群的基础上,使用各个模式分别运行,描述其运行过程。
关于集群搭建,可以参考上一篇笔记。
若有错误的地方,请大佬指正。
在运行Spark程序过程中,可以通过http://driver:4040
访问web UI,查看运行情况。但是运行结束后,就无法再查看。为了后面查看Spark任务的方便,这里先配置下Spark历史服务器。
hadoop/etc/hadoop/core-site.xml
文件中,如下,之前设置端口号为9000<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://master:9000value>
property>
...
configuration>
spark/conf/spark-defaults.conf
,目录下有对应的template文件,复制一下就好,在后面增加内容如下:spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/spark/history
spark/conf/spark-env.sh
,目录下有对应的template文件,复制一下就好,在后面增加内容如下:#历史服务器
export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory = hdfs://master:9000/spark/history -Dspark.history.ui.port=18080"
scp -r /opt/spark/conf Node@slave1:/opt/spark
scp -r /opt/spark/conf Node@slave2:/opt/spark
/opt/hadoop/sbin/start-dfs.sh
hdfs dfs -mkdir /spark
hdfs dfs -mkdir /spark/history
spark/sbin/start-history-server.sh
sbin/start-history-server.sh
![]() |
![]() |
local模式包括 local[N] 模式和 local-cluster 模式,都是在单机上运行。
本地运行模式,用单机的多个线程(单个进程,区分local-cluster模式)来模拟Spark的分布式计算,通常用于验证程序的逻辑是否有问题。
local[N]的N
表示使用N
个线程,每个线程有一个core。
若不指定,则N=1
;若为*
,则N
等于机器上拥有的逻辑核的数量。(Run Spark locally with as many worker threads as logical cores on your machine.)
使用local[N]模式运行时,无需启动Master、Worker守护进程(Standalone模式才需要)。
(这里使用ubuntu默认的python2.7我运行不了,参考Reference.6切换成3.5就可以了)
spark-submit --master local[4] examples/src/main/python/pi.py 1000
本地运行模式,与local[N]的区别在于local-cluster模式使用单机下的多个进程来更大程度地模拟集群的分布式场景,一般也是用于验证程序的逻辑是否有问题。
提交程序需要提供local-cluster[x,y,z]
参数,x
表示生成的executor数目,y
表示每个executor拥有的core数/线程数,z
表示每个executor的memory大小。
spark-submit --master local-cluster[2,4,1024] examples/src/main/python/pi.py 1000
查看运行时的进程,可以看到有一个SparkSubmit进程和两个CoarseGrainedExecutorBackend进程
关于CoarseGrainedExecutorBackend进程,可以参考Reference.3
CoarseGrainedExecutorBackend 是 Executor 运行所在的进程名称,Executor 才是真正处理 Task 的对象,Executor 内部是通过线程池的方式来完成 Task 的计算的。
CoarseGrainedExecutorBackend 是一个消息通信体(其实现了 ThreadSafeRpcEndPoint) ,可以发送信息给 Driver 并可以接受 Driver 中发过来的指令,例如启动 Task 等。
SparkSubmit充当client角色,提交Spark应用
SparkSubmit运行Driver程序,启动SparkContext,获取Executor的信息
本地启动CoarseGrainedExecutorBackend进程,向Driver进程进行Executor的注册,注册成功后在CoarseGrainedExecutorBackend中创建Executor对象
Driver创建tasks,然后将这些tasks发送给 CoarseGrainedExecutorBackend,ExecutorBackend通过调用LaunchTask将任务交给Executors中执行
(此处粗体只是简单地描述了Executor的运行过程,更详细的运行过程可以参考Reference.3)
Standalone模式是指使用Spark原生的资源管理器的集群运行模式。
在Standalone模式下,需要使用Master和Worker节点,其中,Master节点负责资源的调度,即为Cluster Manager,负责控制、管理、监控集群中的worker节点。
Standalone模式分为Client模式和Cluster模式,区别在于——
Client模式适用于测试阶段,不能应用到生产环境中,因此假设提交client提交多个application到集群,则client节点上将会运行多个Driver程序,负载过大。
start-all.sh
启动集群(此处在spark-env.sh中设置SPARK_WORKER_INSTANCES=2
),所以每个slave有两个Worker进程,如下:![]() |
![]() |
spark-submit --master spark://master:7077 --class org.apache.spark.examples.SparkPi examples/jars/spark-examples_2.11-2.4.1.jar 1000
![]() |
![]() |
deploy-mode
spark-submit --master spark://master:7077 --deploy-mode cluster --class org.apache.spark.examples.SparkPi examples/jars/spark-examples_2.11-2.4.1.jar 1000
![]() |
![]() |
![]() |
YARN模式是指使用Hadoop的YARN作为资源管理器的集群运行模式。
在YARN模式下,不需要使用Master和Worker节点,而是使用YARN下的RM节点与NM节点,对应Standalone模式下的Master节点和Worker节点。
YARN的运行流程如下(来自之前的笔记,可以先看一下),Spark的YARN模式流程基本相同。
YARN模式同样分为两种,区别在于——
start-yarn.sh
启动yarn集群,如下:![]() |
![]() |
spark-submit --master yarn --class org.apache.spark.examples.SparkPi examples/jars/spark-examples_2.11-2.4.1.jar 1000
SparkSubmit
进程,执行Driver程序ExecutorLauncher
进程,启动AMCoarseGrainedExecutorBackend
来并发执行程序![]() |
![]() |
![]() |
spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi examples/jars/spark-examples_2.11-2.4.1.jar 1000
SparkSubmit
进程ApplicationMaster
进程,启动Driver,历史服务器也能看到driver在slave2上CoarseGrainedExecutorBackend
来并发执行程序![]() |
![]() |
![]() |
spark学习(基础篇)–(第三节)Spark几种运行模式
Spark多种运行模式
Spark内核 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
spark 从spark-submit开始解析整个任务调度流程
Spark中Standalone的两种提交模式(Standalone-client模式与Standalone-cluster模式)
ubuntu下切换默认的python版本
Hadoop学习——(1) 基础知识
【Spark篇】—Spark中yarn模式两种提交任务方式