Spark中Task数量的分析

本文主要说一下Spark中Task相关概念、RDD计算时Task的数量、Spark Streaming计算时Task的数量。

Task作为Spark作业执行的最小单位,Task的数量及运行快慢间接决定了作业运行的快慢。


开始

先说明一下Spark作业的几个核心概念

Job(作业):Spark根据行动操作触发提交作业,以行动操作将我们的代码切分为多个Job。

Stage(调度阶段):每个Job中,又会根据宽依赖将Job划分为多个Stage(包括ShuffleMapStage和ResultStage)。

Task(任务):真正执行计算的部分。Stage相当于TaskSet,每个Stage内部包含了多个Task,将各个Task下发到各个Executor执行计算。

每个Task的处理逻辑完全一样,不同的是对应处理的数据。即:移动计算而不是移动数据。

Partition(分区):这个是针对RDD而言的,RDD内部维护了分区列表,表示数据在集群中存放的不同位置。

Job、Stage、Task的对应关系如下:
Job-Stage-Task对应图

Task是真正干活的,所以说是它间接决定了Spark程序的快慢也不过分。


再看看Spark任务提交时的几个相关配置

num-executors:配置执行任务的Executor的数量。

executor-cores:每个Executor的核的数量。此核非彼核,它不是机器的CPU核,可以理解为Executor的一个线程。

每个核同时只可以执行一个Task。

也就是说一个Spark应用同时执行的任务数 = 用于执行任务的Executor数 * 每个Executor的核数

spark.executor.memory:每个Executor的内存大小。

spark.default.parallelism:RDD的默认分区数。

在我们没有指定这个参数的前提下,如果是shuffle操作,这个值默认是父RDD中分区数较大的那个值;如果是普通操作,这个值的默认大小取决于集群管理器(YARN, Local这些)。

以YARN为例,如果我们没有指定,它的大小就是所有用于执行任务的Executor核的总数

spark.sql.shuffle.partitions:这个配置是针对于Spark SQL在shuffle时的默认分区数。默认值是200。只对Spark SQL起作用。

RDD计算时Task的数量

在基于RDD计算时,Task的数量 = RDD的分区数

所以调整RDD分区的数量就可以变相的调整Task的数量。

所以当RDD计算跑的很慢时,可以通过适当的调整RDD分区数来实现提速。

看看Spark.parallelize生成RDD时的源码实现:

def parallelize[T: ClassTag](
    seq: Seq[T],
    numSlices: Int = defaultParallelism): RDD[T] = withScope {
   
    assertNotStopped()
        new ParallelCollectionRDD[T](this, seq, numSlices, Map[Int, Seq[String]]())
}

// 这里的taskScheduler.defaultParallelism就是
// 取的配值中spark.default.parallelism的值。
def defaultParallelism: Int = {
   
    assertNotStopped()
        taskScheduler.defaultParallelism
}

可以发现通过Spark.parallelize创建的RDD分区,如果我们不指定分区数,那么分区数就是由配置的spark.default.parallelism来决定。

Spark读Hive、HDFS时的Task数量

spark读取hdfs数据时,最终会生成HadoopRDD,所以HadoopRDD的分区数量就是task数量。

sparkContext.textFile为例,来分析下HadoopRDD的分区数。

// 有两个重载方法。一个要求指定minPartitions,另一个不做要求。
def textFile(path: String): JavaRDD[String] = sc.textFile(path)

// minPartitions是指希望返回的最小分区数。也就说返回的RDD分区数大于或者等于minPartitions。
def textFile(path: String, minPartitions: Int): JavaRDD[String] =
    sc.textFile(path, minPartitions)

一路跟进,最终会调用到org.apache.hadoop.mapred.FileInputFormatgetSplits方法,返回的split数就是rdd分区数。

以下是getSplits方法的实现逻辑,不想看的直接看结论。

// numSplits是期望的分片数量
public InputSplit[] getSplits(JobConf job, int numSplits)
    
  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Spark每个stage的task数量取决于输入数据的分区数和集群可用的计算资源。一般来说,每个分区都会被分配一个task来处理,因此,如果输入数据有100个分区,那么一个stage就会有100个task。但是,如果集群只有50个可用的计算资源,那么这个stage就会被分成两个子stage,每个子stage有50个task。因此,Sparkstage的task数量是动态变化的,取决于输入数据和集群资源的情况。 ### 回答2: 在Spark,任务(Task)是指在一个分布式环境由executor执行的计算任务。而Stage则是指一个有相同Shuffle操作的task集合。 Spark的任务数量是指每个Stage的任务数。根据Spark的流程,每个Stage会被划分为不同的Task。这些Task是由executor执行的,并且通过RDD的partition进行区分。因此,每个Stage的任务数取决于RDD的partition数量,也就是数据块的数量。 在Spark,一个RDD的partition数量通常是用户通过`repartition()`和`coalesce()`函数手动设置的。如果未手动设置,则默认使用Spark的自动分区算法。这个自动分区算法会将数据均匀的分散到集群的每个节点上,尽可能的保证每个partition的大小相同。 一般来说,Spark每个Task会处理一个partition的数据块。因此,Task数量直接取决于partition的数量。如果一个Stage有一个RDD,而这个RDD有100个partition,那么这个Stage就会有100个Task。如果一个Stage有两个RDD(RDD1有50个partition,RDD2有20个partition),那么这个Stage就会有70个Task,因为不同的RDD之间需要进行Shuffle,即数据的重分配和排序。 需要注意的是,任务数量是一个较为理论的概念,实际并不一完全按照这个数量进行划分。例如,资源限制和任务之间的依赖关系等因素都可能影响任务数量Spark也提供了一些参数来限制Task数量,例如`spark.default.parallelism`参数可以设置默认的并行度。 综上所述,SparkStage的任务数量取决于RDD的partition数量和每个Stage有多少个RDD。在实际使用,可以通过调整RDD的partition数量Spark的默认并行度等参数来优化任务数量和性能。 ### 回答3: Spark的Stage是指一组可以并行执行的任务,通常是用户在代码义的一系列数据转换操作。在Spark应用程序,可以通过Spark UI或者Spark日志来查看每个Stage的任务数量。 每个Stage的任务数量取决于输入数据量以及执行过程分区数的数量Spark会把输入数据划分为不同的分区,每个分区都是一个独立的任务,Spark会把这些分区分配给不同的Executor并发执行。因此,输入数据量越大,任务数量就越多。 同时,每个Stage执行的数据转换操作也会影响任务数量。例如,如果用户在代码使用了groupByKey或者reduceByKey等聚合操作,Spark会根据key的值对数据进行分组或聚合,并生成多组数据,每组数据都需要独立处理。这样就会导致任务数量增多,同时也会影响Spark的性能。 总之,每个Stage的任务数量是由输入数据量、执行过程的分区数以及数据转换操作的类型等多个因素决的。为了保证Spark应用程序的性能和效率,需要根据实际情况合理设置输入数据和分区数,尽量避免不必要的数据转换操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值