通常在开发的时候,会设置 master为 local,这样做是为了快速的在本地运行spark程序进行验证。
真实的工作中,开发完spark程序后,需要将程序打包并提交到集群中运行。
1. 打包程序
- 将
setMaster("local")注释掉,因为我们要提交到集群中运行 - 通过maven进行打包
mvn clean pacakge
2. 提交任务到yarn
spark on yarn
1 | spark-submit \ |
| 参数 | 示例 | 描述 |
|---|---|---|
| class | com.example.WordCount2 | 作业的主类。 |
| master | yarn | 在企业中多使用 Yarn 模式。 |
| yarn-client | 等同于 --master yarn --deploy-mode client此时不需要指定 deploy-mode。 |
|
| yarn-cluster | 等同于 --master yarn --deploy-mode cluster此时不需要指定 deploy-mode。 |
|
| deploy-mode | client | client 模式表示作业的 AM 会放在 Master 节点上运行(提交作业的节点本地jvm中)。如果设置此参数,需要指定 Master 为 yarn。 |
| cluster | cluster 模式表示 AM 会随机的在 Worker 节点中的任意一台上启动运行。如果设置此参数,需要指定 Master 为 yarn。 | |
| driver-memory | 4g | Driver 使用的内存,不可超过单机的总内存。 |
| num-executors | 2 | 创建 Executor 的个数。 |
| executor-memory | 2g | 各个 Executor 使用的最大内存,不可以超过单机的最大可使用内存。 |
| executor-cores | 2 | 各个 Executor 使用的并发线程数目,即每个 Executor 最大可并发执行的 Task 数目。 |

涉及的一些概念:
- Application:一个main函数(一般来讲是一个SparkContext)所包含的所有代码就是一个Spark Application;
- Job:每执行一个action都会生成一个Job;
- Stage:一个Spark的job根据是否有宽依赖,划分stage。一般包含一到多个Stage。
- Task:rdd的partition决定了task的数量,一个Stage包含一到多个Task,通过多个Task实现并行运行的功能。
完整运行过程说明如下:
**1.**用户提交任务 用户通过spark-submit提交任务,首先会启动一个Driver进程,其实就是我们编写的Spark程序的main()函数,同时会初始化SparkContext,进而初始化DAGScheduler和TaskScheduler等Spark内部关键组件;
2.Driver申请资源
Driver会向master申请资源,准备去执行Spark算子操作逻辑;
3.Master下发任务
Master收到Driver提交的作业请求之后,向Worker节点指派任务,其实就是让其启动对应的Executor进程;
4.Worker启动Executor进程
Worker节点收到Master节点发来的启动Executor进程任务,就启动对应的Executor进程,同时向Master汇 报启动成功,处于可以接收任务的状态;
5.Executor向Driver反向注册
当Executor进程启动成功后,就向Driver进程反向注册,以此来告诉Driver,谁可以接收任务,执行Spark作 业;Driver接收到注册之后,就知道了向谁发送Spark作业,这样在Spark集群中就有一组独立的executor进程为该driver服务;
6.Driver进行Stage划分和Task分发
SparkContext重要组件运行—DAGScheduler和TaskScheduler,DAGScheduler根据宽依赖将作业划分为若干stage,并为每一个阶段组装一批Task组成TaskSet(TaskSet里面就包含了序列化之后的我们编写的Spark transformation);然后将TaskSet交给TaskScheduler,由其将任务分发给对应的Executor;
7.Executor运行Task Executor进程接收到Driver发送过来的Task,进行反序列化,然后将这些Task放到本地线程池中,调度我们
的作业的执行。