spark 任务运行原理

调优概述

在开发完Spark作业之后,就该为作业配置合适的资源了。Spark的资源参数,基本都可以在spark-submit命令中作为参数设置。很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置这些参数,最后就只能胡乱设置,甚至压根儿不设置。资源参数设置的不合理,可能会导致没有充分利用集群资源,作业运行会极其缓慢;或者设置的资源过大,队列没有足够的资源来提供,进而导致各种异常。总之,无论是哪种情况,都会导致Spark作业的运行效率低下,甚至根本无法运行。因此我们必须对Spark作业的资源使用原理有一个清晰的认识,并知道在Spark作业运行过程中,有哪些资源参数是可以设置的,以及如何设置合适的参数值。

Spark作业基本运行原理

Spark基本运行原理

详细原理见上图。我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程。根据你使用的部署模式(deploy-mode)不同,Driver进程可能在本地启动,也可能在集群中某个工作节点上启动。Driver进程本身会根据我们设置的参数,占有一定数量的内存和CPU core。而Driver进程要做的第一件事情,就是向集群管理器(可以是Spark Standalone集群,也可以是其他的资源管理集群,美团•大众点评使用的是YARN作为资源管理集群)申请运行Spark作业需要使用的资源,这里的资源指的就是Executor进程。YARN集群管理器会根据我们为Spark作业设置的资源参数,在各个工作节点上,启动一定数量的Executor进程,每个Executor进程都占有一定数量的内存和CPU core。

在申请到了作业执行所需的资源之后,Driver进程就会开始调度和执行我们编写的作业代码了。Driver进程会将我们编写的Spark作业代码分拆为多个stage,每个stage执行一部分代码片段,并为每个stage创建一批task,然后将这些task分配到各个Executor进程中执行。task是最小的计算单元,负责执行一模一样的计算逻辑(也就是我们自己编写的某个代码片段),只是每个task处理的数据不同而已。一个stage的所有task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个stage。下一个stage的task的输入数据就是上一个stage输出的中间结果。如此循环往复,直到将我们自己编写的代码逻辑全部执行完,并且计算完所有的数据,得到我们想要的结果为止。

Spark是根据shuffle类算子来进行stage的划分。如果我们的代码中执行了某个shuffle类算子(比如reduceByKey、join等),那么就会在该算子处,划分出一个stage界限来。可以大致理解为,shuffle算子执行之前的代码会被划分为一个stage,shuffle算子执行以及之后的代码会被划分为下一个stage。因此一个stage刚开始执行的时候,它的每个task可能都会从上一个stage的task所在的节点,去通过网络传输拉取需要自己处理的所有key,然后对拉取到的所有相同的key使用我们自己编写的算子函数执行聚合操作(比如reduceByKey()算子接收的函数)。这个过程就是shuffle。

当我们在代码中执行了cache/persist等持久化操作时,根据我们选择的持久化级别的不同,每个task计算出来的数据也会保存到Executor进程的内存或者所在节点的磁盘文件中。

因此Executor的内存主要分为三块:第一块是让task执行我们自己编写的代码时使用,默认是占Executor总内存的20%;第二块是让task通过shuffle过程拉取了上一个stage的task的输出后,进行聚合等操作时使用,默认也是占Executor总内存的20%;第三块是让RDD持久化时使用,默认占Executor总内存的60%。

task的执行速度是跟每个Executor进程的CPU core数量有直接关系的。一个CPU core同一时间只能执行一个线程。而每个Executor进程上分配到的多个task,都是以每个task一条线程的方式,多线程并发运行的。如果CPU core数量比较充足,而且分配到的task数量比较合理,那么通常来说,可以比较快速和高效地执行完这些task线程。

以上就是Spark作业的基本运行原理的说明,大家可以结合上图来理解。理解作业基本原理,是我们进行资源参数调优的基本前提。

转载于:https://www.cnblogs.com/bonelee/p/6042263.html

### 回答1: Spark内部运行原理是,它通过一系列的步骤来处理数据,包括读取数据、转换数据、运行计算任务和存储结果。它使用一个叫做RDD(可分配数据集)的抽象来表示数据,这样可以更容易地处理数据。它还使用一个叫做Spark Core的库来处理数据,这个库可以分发任务到多个节点,并且可以让多个节点协同工作来处理数据。 ### 回答2: Spark是一个快速、通用的大数据处理引擎,它采用了分布式计算的方式来处理大规模数据集。Spark的内部运行原理可以简单概括为以下几个关键点: 1. 弹性分布式数据集(RDD):Spark的核心概念是弹性分布式数据集(RDD),它是一个可分区、可并行处理的数据集合。Spark将数据分成多个RDD,可以在集群的多个节点上自动并行处理。 2. DAG调度:Spark将用户的操作转化为有向无环图(DAG),以表示计算过程中的依赖关系。Spark通过DAG调度,将整个计算流程划分为多个阶段(Stage),以实现任务的并行处理和调度。 3. 分布式数据处理:Spark可以将数据集合分成多个分区,并将每个分区的计算任务分发到不同的节点上并行执行。通过分区级别的并行处理,Spark能够高效地处理大规模数据集,并实现性能上的显著提升。 4. 内存计算:Spark将数据存储在内存中,以避免频繁的磁盘读写操作。通过充分利用内存计算能力,Spark能够在处理数据时提供更高的计算速度和性能。 5. 数据流水线:Spark将数据处理过程划分为多个阶段,并通过内存中的缓存和数据流水线技术,减少中间结果的计算和存储开销。这种方式能够提高计算效率,并减少数据处理的延迟。 总之,Spark的内部运行原理包括了RDD的分布式计算模型、DAG调度、分区级别的并行处理、内存计算和数据流水线等关键技术。通过这些技术的有机结合,Spark能够高效地处理大规模数据集,并提供快速的数据分析和处理能力。 ### 回答3: Spark内部运行原理主要包括以下几个方面。 首先,Spark运行的核心是Resilient Distributed Dataset(RDD),它是一个可容错、可并行处理的数据集合。RDD可以通过数据源创建,或者通过对已有RDD的转换操作得到。RDD的分区决定了数据的并行度,每个分区都存储着数据的一个子集。 其次,Spark运行时采用了分布式的集群架构。集群由一个主节点(即Driver)和多个从节点(即Executors)组成。主节点负责任务的调度和分发,从节点负责具体的任务执行。主节点将任务分成多个Stage,每个Stage包含一系列的任务,并通过DAG表示Stage之间的依赖关系。 然后,Spark通过一种称为Transformations的操作来对RDD进行转换。Transformations分为窄依赖和宽依赖。窄依赖意味着每个父RDD的分区仅有一个子RDD的分区依赖,这可以使得数据传输更快。而宽依赖意味着每个父RDD的分区可能有多个子RDD的分区依赖,这会引入shuffle操作来重新分区,增加了计算和数据传输的开销。 最后,Spark的计算模型是基于弹性分布式数据集的。Spark将计算过程划分为一系列的Stage,并将每个Stage划分为多个Task。Task在Executor上并行执行,每个Task会处理一个或多个RDD的分区。计算结果会被缓存在内存中,可以被后续的计算使用,从而提高了计算效率。 综上所述,Spark内部运行原理主要包括RDD、集群架构、Transformations、计算模型等方面。通过这些机制,Spark实现了高效的分布式计算和数据处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值