Spark多种运行模式

1,测试或实验性质的本地运行模式 (单机)web

该模式被称为Local[N]模式,是用单机的多个线程来模拟Spark分布式计算,一般用来验证开发出来的应用程序逻辑上有没有问题。shell

其中N表明可使用N个线程,每一个线程拥有一个core。若是不指定N,则默认是1个线程(该线程有1个core)。服务器

若是是local[*],则表明 Run Spark locally with as many worker threads as logical cores on your machine.并发

以下:app

spark-submit 和 spark-submit --master local 效果是同样的框架

(同理:spark-shell 和 spark-shell --master local 效果是同样的)
分布式

spark-submit --master local[4] 表明会有4个线程(每一个线程一个core)来并发执行应用程序。oop

那么,这些线程都运行在什么进程下呢?后面会说到,请接着往下看。测试

运行该模式很是简单,只须要把Spark的安装包解压后,改一些经常使用的配置便可使用,而不用启动Spark的Master、Worker守护进程( 只有集群的Standalone方式时,才须要这两个角色),也不用启动Hadoop的各服务(除非你要用到HDFS),这是和其余模式的区别哦,要记住才能理解。ui

那么,这些执行任务的线程,究竟是共享在什么进程中呢?

咱们用以下命令提交做业:

spark-submit --class JavaWordCount --master local[10] JavaWordCount.jar file:///tmp/test.txt 

能够看到,在程序执行过程当中,只会生成一个SparkSubmit进程。

 
 

 

这个SparkSubmit进程又当爹、又当妈,既是客户提交任务的Client进程、又是Spark的driver程序、还充当着Spark执行Task的Executor角色。(以下图所示:driver的web ui)

 

 
 

这里有个小插曲,由于driver程序在应用程序结束后就会终止,那么如何在web界面看到该应用程序的执行状况呢,须要如此这般:(以下图所示)

先在spark-env.sh 增长SPARK_HISTORY_OPTS;

而后启动start-history-server.sh服务;

就能够看到启动了HistoryServer进程,且监听端口是18080。

以后就能够在web上使用http://hostname:18080愉快的玩耍了。

 
 

想必大家已经清楚了第一种运行模式了吧,咱们接着往下说。

2,测试或实验性质的本地伪集群运行模式(单机模拟集群)

这种运行模式,和Local[N]很像,不一样的是,它会在单机启动多个进程来模拟集群下的分布式场景,而不像Local[N]这种多个线程只能在一个进程下委屈求全的共享资源。一般也是用来验证开发出来的应用程序逻辑上有没有问题,或者想使用Spark的计算框架而没有太多资源。

用法是:提交应用程序时使用local-cluster[x,y,z]参数:x表明要生成的executor数,y和z分别表明每一个executor所拥有的core和memory数。

  spark-submit --master local-cluster[2, 3, 1024]

(同理:spark-shell --master local-cluster[2, 3, 1024]用法也是同样的)

上面这条命令表明会使用2个executor进程,每一个进程分配3个core和1G的内存,来运行应用程序。能够看到,在程序执行过程当中,会生成以下几个进程:

 
 

SparkSubmit依然充当全能角色,又是Client进程,又是driver程序,还有点资源管理的做用。生成的两个CoarseGrainedExecutorBackend,就是用来并发执行程序的进程。它们使用的资源以下:

 
 

运行该模式依然很是简单,只须要把Spark的安装包解压后,改一些经常使用的配置便可使用。而不用启动Spark的Master、Worker守护进程( 只有集群的standalone方式时,才须要这两个角色),也不用启动Hadoop的各服务(除非你要用到HDFS),这是和其余模式的区别哦,要记住才能理解。下面说说集群上的运行模式。

3,Spark自带Cluster Manager的Standalone Client模式(集群)

终于说到了体现分布式计算价值的地方了!(有了前面的基础,后面的内容我会稍微说快一点,只讲本文的关注点)

和单机运行的模式不一样,这里必须在执行应用程序前,先启动Spark的Master和Worker守护进程。不用启动Hadoop服务,除非你用到了HDFS的内容。

start-master.sh

start-slave.sh -h hostname url:master

图省事,能够在想要作为Master的节点上用start-all.sh一条命令便可,不过这样作,和上面的分开配置有点差异,之后讲到数据本地性如何验证时会说。

启动的进程以下:(其余非Master节点上只会有Worker进程)

 
 

这种运行模式,可使用Spark的8080 web ui来观察资源和应用程序的执行状况了。

 
 

能够看到,当前环境下,我启动了8个worker进程,每一个可以使用的core是2个,内存没有限制。

言归正传,用以下命令提交应用程序

spark-submit --master spark://wl1:7077

或者 spark-submit --master spark://wl1:7077 --deploy-mode client

表明着会在全部有Worker进程的节点上启动Executor来执行应用程序,此时产生的JVM进程以下:(非master节点,除了没有Master、SparkSubmit,其余进程都同样)

 
 

Master进程作为cluster manager,用来对应用程序申请的资源进行管理;

SparkSubmit 作为Client端和运行driver程序;

CoarseGrainedExecutorBackend 用来并发执行应用程序;

注意,Worker进程生成几个Executor,每一个Executor使用几个core,这些均可以在spark-env.sh里面配置,此处不在啰嗦。

 
这是driver web ui的显示,能够看到每一个executor的资源使用状况

 

4,spark自带cluster manager的standalone cluster模式(集群)

这种运行模式和上面第3个仍是有很大的区别的。使用以下命令执行应用程序(前提是已经启动了spark的Master、Worker守护进程)不用启动Hadoop服务,除非你用到了HDFS的内容。

spark-submit --master spark://wl1:6066 --deploy-mode cluster

各节点启动的JVM进程状况以下:

master节点上的进程

 
 

提交应用程序的客户端上的进程

 
 

某worker节点上的进程

 
 

客户端的SparkSubmit进程会在应用程序提交给集群以后就退出(区别1)

Master会在集群中选择一个Worker进程生成一个子进程DriverWrapper来启动driver程序(区别2)

而该DriverWrapper 进程会占用Worker进程的一个core,因此一样的资源下配置下,会比第3种运行模式,少用1个core来参与计算(观察下图executor id 7的core数)(区别3)

 
 

应用程序的结果,会在执行driver程序的节点的stdout中输出,而不是打印在屏幕上(区别4)

5,基于YARN的Resource Manager的Client模式(集群)

如今愈来愈多的场景,都是Spark跑在Hadoop集群中,因此为了作到资源可以均衡调度,会使用YARN来作为Spark的Cluster Manager,来为Spark的应用程序分配资源。

在执行Spark应用程序前,要启动Hadoop的各类服务。因为已经有了资源管理器,因此不须要启动Spark的Master、Worker守护进程。相关配置的修改,请自行研究。

使用以下命令执行应用程序

spark-submit --master yarn 

或者 spark-submit --master yarn --deploy-mode client

提交应用程序后,各节点会启动相关的JVM进程,以下:

在Resource Manager节点上提交应用程序,会生成SparkSubmit进程,该进程会执行driver程序。

 
 

RM会在集群中的某个NodeManager上,启动一个ExecutorLauncher进程,来作为

ApplicationMaster。另外,也会在多个NodeManager上生成CoarseGrainedExecutorBackend进程来并发的执行应用程序。

 
 

对应的YARN资源管理的单元Container,关系以下:

 
 

为ApplicationMaster生成了容器 000001;

为CoarseGrainedExecutorBackend生成了容器 000002-000003

6,基于YARN的Resource Manager的Custer模式(集群)

使用以下命令执行应用程序:

spark-submit --master yarn --deploy-mode cluster

和第5种运行模式,区别以下:

在Resource Manager端提交应用程序,会生成SparkSubmit进程,该进程只用来作Client端,应用程序提交给集群后,就会删除该进程。

 
 

Resource Manager在集群中的某个NodeManager上运行ApplicationMaster,该AM同时会执行driver程序。紧接着,会在各NodeManager上运行CoarseGrainedExecutorBackend来并发执行应用程序。

 
 

应用程序的结果,会在执行driver程序的节点的stdout中输出,而不是打印在屏幕上。

对应的YARN资源管理的单元Container,关系以下:

 
 

为ApplicationMaster生成了容器 000001

为CoarseGrainedExecutorBackend生成了容器 000002-000003

固然,3-6这几种运行模式,你也能够在一台单机上玩,前提是你的服务器足够牛,同时你也足够无聊。

欢迎指正,转载请标明做者和出处,谢谢。

做者:俺是亮哥 连接:https://www.jianshu.com/p/65a3476757a5 來源:简书 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
相关文章
相关标签/搜索