spark漫谈二

一、几种提交方式的区别

1.local模式

1)怎么开启local模式?
几乎不用修改任何配置,就是local模式。
2)怎么进入local模式?
执行spark-shell、spark-submit、spark-sql时,如果指定–master的参数为local或者不指定–master,即使项目已经部署成standalone等模式,都会进入local模式。
此外:开启spark-shell、spark-sql会相当于开启一个spark应用,实质会开启一个sparkSubmit进程,同时可以通过4040端口开启Job界面,分别输入“:quit”“quit;”可以停止进程,之后4040界面也关闭。
3)local模式下的–deploy-mode
spark-shell、spark-sql、spark-submit的–deploy-mode 不可以使用cluster(会报错:Error: Cluster deploy mode is not compatible with master “local”),可以使用client,而且默认就是client。

2.standalone模式

1)怎么开启standalone模式?
首先要部署成standalone模式,然后执行sbin/start-all.sh启动standalone模式。
通过8080端口开启集群监控界面,查看master的地址,如spark://BigData-C1:7077。

2)怎么进入standalone模式?
执行spark-shell、spark-submit、spark-sql时,指定–master的参数为spark://BigData-C1:7077,才可进入standalone模式。如果没有指定,则会进入local模式(验证这一点很简单,通过getNumPartitions,会发现返回数据和local模式下的大小一样。)。
此外:开启spark-shell、spark-sql会相当于开启一个spark应用,实质会开启一个sparkSubmit进程,同时可以通过4040端口开启Job界面,分别输入“:quit”“quit;”可以停止进程,之后4040界面也关闭。
3)standalone模式下的–deploy-mode
(1)spark-submit的–deploy-mode可以使用cluster。但有时候回报警告Master endpoint spark://BigData-C1:7077 was not a REST server.如下:

也可以使用client,会开启一个应用。如下:

(2)spark-shell的–deploy-mode 不可以使用cluster(会报错:Error: Cluster deploy mode is not compatible with master “local”)。如下:

可以使用client,会开启一个应用。如下:

(3)spark-sql的–deploy-mode不可以使用cluster(会报错:Error: Cluster deploy mode is not applicable to Spark SQL shell.),如下:

也可以使用client,会开启一个应用。如下:

3.yarn模式(实际生产中使用)

1)怎么开启yarn模式?
修改spark的相关配置后,开启hadoop中的yarn即可。

2)怎么进入yarn模式?

执行spark-shell、spark-submit、spark-sql时,指定–master的参数为yarn,才可进入yarn模式。如果没有指定,则会进入local模式(验证这一点很简单,通过getNumPartitions,会发现返回数据和local模式下的大小一样。)。
此外:开启spark-shell、spark-sql会相当于开启一个spark应用,实质会开启一个sparkSubmit进程,同时可以通过4040端口开启Job界面,分别输入“:quit”“quit;”可以停止进程,之后4040界面也关闭。

3)yarn模式下的–deploy-mode
(1)spark-submit的–deploy-mode可以使用cluster,通过yarn的8088界面可以观察运行结果,此时4040端口的界面无效。如下:

也可以使用client,会开启一个应用。如下:

(2)spark-shell的–deploy-mode不可以使用cluster,会报错(Error: Cluster deploy mode is not applicable to Spark shells.)如下:

可以使用client,会开启一个应用。如下:

(3)spark-sql不可以使用cluster,会报错(Error: Cluster deploy mode is not applicable to Spark shells.)如下:

可以使用client,会开启一个应用。如下:

注意:spark-shell、spark-sql、spark-submit不能共用同一个端口口进行监测,随机分别使用4040、4041、4042。
二、deploy-mode为client和cluster的区别
以standalone模式来说明,如下:

1.client模式
driver将运行在提交应用的主机上。driver需要等程序执行完后才能退,集群上只会出现Executor进程。测试时通常client模式。

上图是client模式,driver运行在submit的机器上,executor运行在work机器上。

举例说明:
Spark集群为BigData-C1、BigData-C2、BigData-C3,其中BigData-C1为Master节点,BigData-C2和BigData-C3为worker节点。在BigData-C4上提交任务。在BigData-C4上提交任务,执行
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://BigData-C1:7077 --deploy-mode client examples/jars/spark-examples_2.11-2.2.0.jar 100后,出现以下现象:
1)各节点jps观察结果如下:

2)8080界面观察结果如下:

注意:Application未结束前,是出现在Running Applications栏目中的。
1)解释:上述结果说明在spark集群的每个worker节点上都启动了一个Executor进程,但是集群内没有启动Driver进程,Driver进程在提交任务的机器BigData-C4上启动,即SparkSubmit。结果和理论相符。
2)注意事项:
(1)client mode下,Driver运行在提交任务的机器上。如果是在集群内的某个节点,无论该节点是master还是worker,规则是一样的。
(2)client mode下Master和Worker节点必须处于同一片局域网内,因为Driver要和Executorr通信,例如Driver需要将Jar包通过Netty HTTP分发到Executor,Driver要给Executor分配任务等。
(3)client mode下没有监督重启机制,Driver进程如果挂了,需要额外的程序重启。

2.cluster mode
driver将随机运行集群的某一个节点上。Driver不需要等程序执行完后才能退,集群上会出现driver进程和Executor进程。生产中使用cluster模式。

上图是cluster模式,driver在集群中任选一台机器运行。图中有错误:启动了Driver的worker节点上是不能再启动Executor的。

举例说明:
Spark集群为BigData-C1、BigData-C2、BigData-C3,其中BigData-C1为Master节点,BigData-C2和BigData-C3为worker节点。在BigData-C4上提交任务,执行
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://BigData-C1:6066 --deploy-mode cluster examples/jars/spark-examples_2.11-2.2.0.jar 100后,出现以下现象:
1)各节点jps观察结果如下:

2)8080界面观察结果如下:

注意:Application未结束前,是出现在Running Applications栏目中的。Driver未结束前,是出现在Running drivers栏目中的。
3)解释:上述结果说明在spark集群中的一个worker节点上启动了Driver进程,在剩余的worker节点上启动了一个Executor,而在BigData-C4上没有启动任何进程。换言之,如果集群的某个worker节点上启动了Driver,那么该节点上不能再启动Executor。而且,在BigData-C4提交任务时,会很快结束提交,不会等待结果返回。如下:

而与此同时在8080界面上会出现Running drivers和Running Applications。结果与理论想符合。
3)注意事项:
(1)Driver程序在worker集群中某个节点,而非Master节点,但是这个节点由Master指定。
(2)Driver程序占据Worker的资源。
(3)cluster mode下Master可以使用–supervise对Driver进行监控,如果Driver挂了可以自动重启。
(4)cluster mode下Master节点和Worker节点一般不在同一局域网,因此就无法将Jar包分发到各个Worker,所以cluster mode要求必须提前把Jar包放到各个Worker几点对应的目录下面。
注意:Yarn等模式的结论和standalone模式一样!

3.该选择client mode还是cluster mode呢?
一般来说,如果提交任务的节点(即Master)和Worker集群在同一个网络内,此时client mode比较合适。如果提交任务的节点和Worker集群相隔比较远,就会采用cluster mode来最小化Driver和Executor之间的网络延迟。
测试中一般选择client mode,生产中一般选择cluster mode。

三、理清概念
1.执行如下操作

说明:启动1个由1个master和1个worker构成的standalone集群,默认分区数为2。

1)执行bin/spark-shell --master spark://BigData-C1:7077后,在8080端口监控界面可以看到开启了一个应用,如下:

2)输入如下内容,一直到saveAsTextFile,在4040端口监控界面会看到开启了一个Job。
val file = sc.textFile(“hdfs://BigData-C3:8020/input/1.txt”)
val words = file.flatMap(.split(" "))
val word2count = words.map((
,1))
val result = word2count.reduceByKey(+)
result.saveAsTextFile(“hdfs://BigData-C3:8020/output”)

提示:如果继续输入sc.stop(),Job会停止,4040监控界面将关闭。8080界面的应用将由Running Applications变为Completed Applications,如果继续输入内容,将会有如下提示:

3)查看界面信息
先看8080界面

点击进入查看Job的DAG和stage,如下:

查看stage 0的详细内容,如下:

查看stage 1的详细内容,如下:

2.理清概念
参考:https://blog.csdn.net/weixin_43866709/article/details/88633033

1)Application:开启一次spark-shell就相当于开启了一个Application。
2)Driver:运行main方法的地方和创建SparkContext的地方。Driver存在于Application中,一个Application中只有一个Driver。
3)Job:Job存在于Application中,一个Application中可以有多个Job。比如,在同一个spark-shell中,每次执行一次action都会创建一个job。
4)Stage:Stage存在于Job中,一个Job中可以有多个Stage。Stage的数量由程序执行流程中的依赖决定。
5)Task:Task是线程,从程序的角度来理解,它存在于进程Executor中,一个Executor中可以有多个Task。从业务的角度来理解,它存在于Stage,一个Stage中可以有多个Task,通常称之为TaskSet。
Task的数量:横向看,有多少个分区就最多有多少个task;纵向看,一个job中的task总数等于所有stage的task数的总和。分区指的是数据的分布情况/划分的情况,但是task指的逻辑代码+数据的执行状态;一个stage的中的所有task的执行逻辑是一样的,唯一的区别的是处理不同分区的数据。
特别说明:如果使用spark消费kafka中的数据,在最开始的stage中,task的数量默认和kafka中的分区数是一样多的。后面的stage中的task的数量将由程序决定,好像(需要验证)默认是100。对于sc.parallelize(Array(1 to 10)),在standalone模式下,当运行环境是集群时,默认分区数和集群的总core数一致;当运行环境是单节点时,由版本中的代码或配置指定。

6)Executor:与worker(或nodemanager)运行在相同的节点上的进程,其内部运行task线程。注意,Executor和worker(或nodemanager)都是进程,Executor不是运行在worker(或nodemanager)内部,即便Executor运行成功后,worker(或nodemanager)挂掉了,Executor也不会停止。
一个节点上可以运行多个executor,一个executor中可以运行多个task线程任务。Executor的数量:YARN模式下可以指定Executor数量,standalone下不能指定Executor数量。当不能人为指定数量时,默认每个worker上会开启一个Executor。实际使用Executor数会根据分区数来确定。以sc.parallelize(Array(1 to 1000),partitions)为例,如果分区数partitions小于集群的worker数,那意味着task数也小于集群的worker数,那就只需要启动和task个数一样多的Executor。如果分区数partitions大于集群的worker数,那意味着task数也大于集群的worker数,但是系统只会启动和worker个数一样多的Executor。

7)DAGScheduler: 根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法,如下图:

8)TASKSedulter: 将TaskSet提交给worker上的Executor运行,每个Executor运行什么Task就是在此处分配的。TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。下图展示了TaskScheduler的作用:

以上所有术语串起来的运行层次图如下:

9)Cluter Manager:指的是在集群上获取资源的外部服务。目前有三种类型

Standalone : spark原生的资源管理,由Master负责资源的分配。

Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架。

Hadoop Yarn: 主要是指Yarn中的ResourceManager。
3.分区数的确定

textFile的分区数:
https://blog.csdn.net/weixin_43866709/article/details/88633033
默认是2,可以人为指定。

Parallelize的分区数:

https://blog.csdn.net/qq_35744460/article/details/89950378
默认是集群的core数,可以人为指定。

结论:分区并非越多越好,有可能会造成数据处理更慢。实际生产中应以测量结果为准。

四、整体业务流程分析
1.资源规划

在基于standalone的Spark集群,Cluster Manger就是Master。

Master负责分配资源,在集群启动时,Driver向Master申请资源,Worker负责监控自己节点的内存和CPU等状况,并向Master汇报。

从资源方面,可以分为两个层面:

1)资源的管理和分配
资源的管理和分配,由Master和Worker来完成。Master给Worker分配资源,
Master时刻知道Worker的资源状况。
客户端向服务器提交作业,实际是提交给Master。

2)资源的使用
资源的使用,由Driver和Executor。程序运行时候,向Master请求资源。
2.流程分析
以在standalone模式为例,从物理部署层面上来看,Spark主要分为两种类型的节点,Master节点和Worker节点。Master节点主要运行集群管理器的中心化部分,所承载的作用是分配Application到Worker节点,维护Worker,Driver,Executor的状态。Worker节点负责具体的业务运行。系统业务流程如下:
1)Client首先和Master通信,申请资源;
2)Master通知Worker和Client通信,为其申请资源;
3)Worker和Client通信,实则和Client内置的http服务器通信。Client向Worker提交jar包,Worker根据要求在节点上创建Executor。
4)Client和Executor通信。
注意:上述提到的Client实际是指Driver,不要和deploy-mode中的client混为一谈。deploy-mode强调的是driver运行在何处。

如果是Yarn模式,Executor则是在Container内部启动。Client还会将其目录jars下的jar包提交到Yarn集群。

Yarn详细流程如下:

3.深入driver

1)构建Spark Application的运行环境,启动SparkContext。
2)SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend。
3)Executor向SparkContext申请Task。
4)SparkContext将应用程序分发给Executor。
5)SparkContext构建成DAG图,将DAG图分解成Stage、将Taskset发送给Task Scheduler,最后由Task Scheduler将Task发送给Executor运行。
6)Task在Executor上运行,运行完释放所有资源。
五、spark调优

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值