spark任务的提交流程

SparkContext介绍

spark任务的提交流程

  1. 用户创建一个 Spark Context
  2. Spark Context 去找 Cluster Manager 申请资源同时说明需要多少 CPU 和内存等资源;
  3. Cluster Manager 根据用户提交时设置的参数(CPU、内存),去找 WorkerNode 并启动 Executor,并介绍 Executor 给Driver;
  4. Driver 会将用户程序划分为不同的 stage每个 stage 会有一组完全相同的 task 来构成。这些 task 会作用于一些待处理的数据和不同的分区,在阶段划分和 task 创建完成后Driver 会向 Executor 发送 task
  5. Executor 在接收到 task 后会下载 task 运行时的依赖准备好 task 的运行环境,然后开始执行 task 并实时将 task 的运行环境传输给 Driver;
  6. Driver 根据收到的 task 的运行情况来进行状态更新,不断的调用 task 来交给 Executor 执行,直到 task 全部执行正确。若超过最大重试次数还没有执行成功,就会停止 task。

1. 资源申请与初始化

  • 用户创建SparkContext(SC),SC向集群管理器(如YARN或Standalone Master)申请资源,指定CPU和内存需求
  • 集群管理器根据参数分配资源:
    • Standalone模式:Master直接管理Worker节点,创建Executor并注册到SC
    • YARN模式:RM创建ApplicationMaster(AM),AM通过NodeManager(NM)申请容器资源启动Executor

2. 任务划分与调度

  • Driver(即SC所在进程)将用户程序解析为DAG图,根据宽依赖(ShuffleDependency)划分Stage
    • 宽依赖触发Shuffle操作,形成ShuffleMapStage
    • 窄依赖合并为ResultStage
  • 每个Stage被拆分为多个Task,每个Task对应一个数据分区的处理逻辑

3. 任务执行

  • Executor接收Task后:
    1. 下载任务依赖的代码和数据
    2. 创建线程池并行执行Task
    3. 实时向Driver汇报执行进度和状态
  • 任务失败时自动重试,超过最大重试次数则作业失败

4. 资源释放与结果处理

  • 所有Task执行完成后:
    • Driver生成最终结果(如写入存储系统)
    • SC向集群管理器释放资源
    • 在YARN模式中,AM会主动注销应用

附:关键组件协作示意图

Spark任务提交流程通常涉及以下几个步骤: 1. **初始化SparkContext**:首先,你需要创建一个`SparkConf`对象,配置Spark应用程序的基本设置,如主应用服务器、JVM选项等。然后,通过`SparkConf`实例创建`SparkContext`。 ```java SparkConf conf = new SparkConf().setAppName("YourAppName").setMaster("local[*]"); // 或者 "spark://master:port" SparkContext sc = new SparkContext(conf); ``` 2. **加载数据**:根据任务需求,从各种数据源加载数据,例如HDFS、文件系统、数据库等,可以使用Spark提供的RDD API或者DataFrame API。 ```java JavaPairRDD<String, Integer> data = sc.textFile("file:///path/to/data.txt").mapToPair(line -> { String[] parts = line.split(","); return (parts[0], Integer.parseInt(parts[1])); }); ``` 3. **编写并封装操作**:定义处理数据的函数或操作,比如转换、过滤、聚合等,并将其包装成`TransformFunction`或`ActionFunction`。 ```java Function2<JavaPairRDD<String, Integer>, JavaPairRDD<String, Integer>, PairRDD<String, Integer>> mapFunc = (rdd, acc) -> rdd.mapValues(value -> value * 2); // 示例操作 PairRDD<String, Integer> result = data.transform(mapFunc); ``` 4. **调用Action**:最后,使用`action`方法(如`count()`、`collect()`等)触发实际的数据处理,将结果保存到磁盘或者显示出来。 ```java long count = result.count(); // 或 result.collectAsList(); ``` 5. **关闭SparkContext**:当完成所有任务后,记得关闭`SparkContext`释放资源。 ```java sc.stop(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值