Spark_05_spark打包运行
Enoch

通常在开发的时候,会设置 master为 local,这样做是为了快速的在本地运行spark程序进行验证。

真实的工作中,开发完spark程序后,需要将程序打包并提交到集群中运行。

1. 打包程序

  1. setMaster("local") 注释掉,因为我们要提交到集群中运行
  2. 通过maven进行打包 mvn clean pacakge

2. 提交任务到yarn

spark on yarn

1
2
3
4
5
6
7
8
9
10
spark-submit \
--class org.example.App2 \
--master yarn \
--deploy-mode client \
--executor-memory 512M \
--num-executors 1 \
--executor-cores 2 \
spark-learning-1.0-SNAPSHOT.jar

spark-submit --class org.example.App2 --master yarn --deploy-mode client --executor-memory 512M --num-executors 1 --executor-cores 2 spark-learning-1.0-SNAPSHOT.jar
参数 示例 描述
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 数目。

image-20250322110355871

涉及的一些概念:

  • 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.ExecutorDriver反向注册

当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放到本地线程池中,调度我们

的作业的执行。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量