spark 调度流程

Client模式Driver位置解析
本文解析了在Client模式下Driver的具体位置及与Cluster模式的区别。介绍了Driver如何在提交机上运行,并对比了Cluster模式下Driver放置于某个节点的情况。

说明:这里为client模式,所有diver是在提交机上。如果是cluster模式,会有些许差异,差异主要是driver

会放置在某一个节点上。


这张图是在一个教程里截取的,本人觉得描述的比较好,在这里存储方便自己查询。


### Spark中DAG调度流程详解 #### 任务提交与执行 当用户提交一个Spark作业时,例如通过`rdd.collect()`触发的行动操作,Spark会将此操作转化为一个或多个Job。每个Job会被进一步分解为Stage,而Stage是基于宽依赖(Shuffle Dependency)划分的[^2]。在Stage内部的任务称为Task,这些Task会在Executor上并行执行。 #### DAG生成过程 DAG(有向无环图)是在Spark调度器中生成的,它表示了RDD之间的转换关系。对于以下代码片段: ```scala val rdd = sc.textFile("hdfs://data.txt") .flatMap(_.split(" ")) .map((_, 1)) .reduceByKey(_ + _) rdd.collect() ``` 上述代码中的`flatMap`和`map`操作属于窄依赖,而`reduceByKey`引入了Shuffle操作,因此会形成一个新的Stage。整个DAG由多个Stage组成,Stage之间通过Shuffle进行数据交换[^2]。 #### 调度器组件 Spark调度器主要由以下几个部分组成: - **DAGScheduler**:负责将Job分解为多个Stage,并生成TaskSet。它还负责处理Stage之间的依赖关系。 - **TaskScheduler**:负责将Task分配给Worker节点上的Executor执行,并与集群管理器(如YARN或K8s)通信以获取资源。 - **SchedulerBackend**:与集群管理器交互,管理Executor资源的申请、释放等操作[^2]。 #### 资源管理与任务分配 在任务分配过程中,SchedulerBackend会根据集群管理器的反馈动态调整资源分配策略。例如,在YARN模式下,SchedulerBackend会通过YARN ResourceManager申请Container资源,并将Task分配到对应的Container中执行[^2]。 #### 性能监控与优化 Spark Web UI是一个重要的工具,用于可视化DAG的构建和执行情况。通过Web UI,用户可以查看每个Stage的执行时间、Shuffle读写量以及Task的分布情况,从而更好地理解和优化Spark作业的性能[^1]。 #### 示例代码 以下是一个简单的Spark作业示例,展示了如何通过`collect`触发DAG的生成与执行: ```python from pyspark.sql import SparkSession spark = SparkSession.builder.appName("DAGExample").getOrCreate() data = spark.sparkContext.parallelize(["apple banana", "orange apple", "banana orange"]) word_counts = data.flatMap(lambda line: line.split(" ")) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a + b) result = word_counts.collect() print(result) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值