1.Spark运行模式分类
Spark常用运行模式
local
yarn-client yarn-cluster
standalone-client standalone-cluster
本地模式
Spark单机运行,一般用于开发测试。
Standalone模式
构建一个由Master+Slave构成的Spark集群,Spark运行在集群中。
Spark on Yarn模式
Spark客户端直接连接Yarn。不需要额外构建Spark集群
常用参数:
--master Spark运行模式
--deploy-mode 在指定的运行模式下是cluster还是client模式
--class 主类完全限定名称
--jars 指定需要的本地的jar包,以逗号分隔
--files 指定配置文件,一般指hive的配置文件
--conf 指定Spark的配置属性
--driver-memory 指定driver的内存
--executor-memory 指定每个executor内存
--driver-cores driver核心数,默认1个(限Standalone)
--supervise 失败是否重启driver(限Standalone和Mesos)
--total-executor-cores executor使用的总核数(限Standalone和Mesos)
2.Spark local模式
local可以分为两个,一种在Linux上运行,一种是本地IDE工具运行
Linux上的local:spark-shell --master local[n]
IDE开发工具中的local:直接启动Spark程序
3.Spark Standalone 模式
spark standalone分为两种模式:client cluster
1.client模式:
启动方式:
spark-submit --master spark://Linux001:7077
spark-submit --master spark://Linux001:7077 --deploy-mode client
执行流程:
1、创建SparkContext对象时,客户端先在本地启动driver,然后向Master节点申请任务所需要
的资源。
2、master收到请求,找到满足资源条件要求的worker启动executor,executor启动成功向driver
注册自己。
3、当遇到action时,触发一个job执行。
4、首先DAGScheduler按RDD的宽窄依赖关系切割job划分stage,然后将stage以TaskSet的方式提
交给TaskScheduler。
5、TaskScheduler遍历TaskSet将一个个task发送到executor的线程池中执行。
6、driver会监控所有task执行的整个流程,并将执行完的结果回收。
弊端:
由于client模式下driver运行在客户端,当应用程序很多且driver和worker有大量通信的时候,
会急剧增加driver和executor之间的网络IO。大量的dirver的运行会对客户端的资源造成巨大的压力。
2.cluster模式:
启动方式:
spark-submit --master spark://Linux001:7077 --deploy-mode cluster
执行流程:
1、创建SparkContext对象时,客户端先向master申请启动driver,Master收到请求会找一台合
适的worker启动driver。
2、driver启动成功后向master申请资源,master找到满足资源条件要求的worker启动
executor,executor启动成功向driver注册自己。
3、当遇到action时,触发一个job执行。
4、首先DAGScheduler按RDD的宽窄依赖关系切割job划分stage,然后将stage以TaskSet的方式提
交给TaskScheduler。
5、TaskScheduler遍历TaskSet将一个个task发送到executor的线程池中执行。
6、driver会监控所有task执行的整个流程,并将执行完的结果回收。
4.Spark on Yarn 模式
Spark on Yarn两种模式:client模式 cluster模式
区别:看driver运行在哪里。
client模式的driver是运行在客户端。
cluster模式的driver运行在NodeManager的ApplicationMaster中。
1.client模式
启动:
spark-submit --master yarn //默认启动client模式
spark-submit --master yarn-client
spark-submit --master yarn --deploy-mode client
执行流程:
1、创建sparkContext对象时,客户端先在本地启动driver,然后客户端向ResourceManager节点申请启
动应用程序的ApplicationMaster。
2、ResourceManager收到请求,找到满足资源条件要求的NodeManager启动第一个Container,然
后要求该NodeManager在Container内启动ApplicationMaster。
3、ApplicationMaster启动成功则向ResourceManager申请资源,ResourceManager收到请求给
ApplicationMaster返回一批满足资源条件的NodeManager列表。
4、Applicatio拿到NodeManager列表则到这些节点启动container,并在container内启动executor,executor启动成功则会向driver注册自己。
5、executor注册成功,则driver发送task到executor,一个executor可以运行一个或多个task。
6、executor接收到task,首先DAGScheduler按RDD的宽窄依赖关系切割job划分stage,然后将stage以TaskSet的方式提交给TaskScheduler。
7、TaskScheduler遍历TaskSet将一个个task发送到executor的线程池中执行。
8、driver会监控所有task执行的整个流程,并将执行完的结果回收。
弊端:
由于client模式下driver运行在客户端,当应用程序很多且driver和worker有大量通信的时候,会急剧增加
driver和executor之间的网络IO。并且大量的dirver的运行会对客户端的资源造成巨大的压力。
2.cluster模式
启动:
spark-submit --master yarn-cluster
spark-submit --master yarn --deploy-mode cluster
执行流程:
1、创建sparkContext对象时,客户端向ResourceManager节点申请启动应用程序的
ApplicationMaster。
2、ResourceManager收到请求,找到满足资源条件要求的NodeManager启动第一个Container,然
后要求该NodeManager在Container内启动ApplicationMaster。
3、ApplicationMaster启动成功则向ResourceManager申请资源,ResourceManager收到请求给
ApplicationMaster返回一批满足资源条件的NodeManager列表。
4、Applicatio拿到NodeManager列表则到这些节点启动container,并在container内启动executor,executor启动成功则会向driver注册自己。
5、executor注册成功,则driver发送task到executor,一个executor可以运行一个或多个task。
6、executor接收到task,首先DAGScheduler按RDD的宽窄依赖关系切割job划分stage,然后将stage以TaskSet的方式提交给TaskScheduler。
7、TaskScheduler遍历TaskSet将一个个task发送到executor的线程池中执行。
8、driver会监控所有task执行的整个流程,并将执行完的结果回收。
3.注意点:
提交作业时spark会将lib下的spark-assembly*.jar包分发到yarn的am container中,这十分耗费资
源。我们可以将该jar包放在一个yarn可以访问到的目录中:
vi spark-default.conf
spark.yarn.jars hdfs://Linux001:8020/somepath/spark-assembly*.jar
将jar包上传至hdfs://Linux001/somepath/
4.调整参数
spark.port.maxRetries
同时运行的最大作业数目,默认16,肯定不够,建议调大
spark.yarn.maxAppAttempts
作业最大重试次数,它不应该大于yarn配置中设置的全局最大重试数。默认是等于的。
Spark on Yarn Cluster模式
Spark on Yarn Client 模式