菜单
本页目录

Spark 并行度

Spark并行度:在同一时间内,有多少个Task同时运行

Spark并行度指的是在同一时间内,能够并行运行的Task数量。并行度的设置直接影响作业的执行效率,因为它决定了集群资源的利用率。如果并行度过低,会导致资源闲置,执行效率低下;如果并行度过高,则可能导致过度竞争资源,增加调度开销。


并行度的定义

并行度表示可以同时运行的Task的数量。在Spark中,并行度的设置会影响RDD的分区数量,因为每个Task对应RDD的一个分区。通过合理地设置并行度,可以优化Spark作业的执行。

关键点:

  • 设置的并行度数量决定有多少个Task可以同时运行。
  • 并行度越高,数据将会被划分成更多的分区,更多Task会并行运行,从而提高资源利用率。

设置并行度的方式

Spark并行度可以在不同的地方进行设置,优先级从高到低依次是:

  1. 代码中显式设置(最高优先级)
  2. 提交应用程序时的客户端参数中设置
  3. 配置文件中设置
  4. 默认并行度(基于读取文件的分片数量)

全局并行度设置

spark.default.parallelism 是控制并行度的全局配置参数。一般来说,建议设置为集群可用CPU核心数的2~10倍,以确保CPU核心得到充分利用。

全局并行度是推荐设置,不要针对RDD改分区,可能会影响内存迭代管道的构建,或者会产生额外的shuffle

设置方法
  1. 在配置文件中设置

    conf/spark-defaults.conf中设置
    spark.default.parallelism 100
    
  2. 在客户端提交参数中设置

    bin/spark-submit --conf "spark.default.parallelism=100"
    
  3. 在代码中设置

    conf = SparkConf()
    conf.set('spark.default.parallelism', '100')
    

推荐全局并行度设置

  • 建议使用全局配置spark.default.parallelism,而不是针对每个RDD手动设置分区数量,因为手动设置分区会产生额外的shuffle,增加作业的复杂性和资源消耗。

针对RDD的并行度设置(不推荐)

在某些特殊情况下,你可以针对特定的RDD手动调整分区数量来控制并行度,但这种做法不推荐,尤其是在大多数场景下更适合使用全局并行度配置。

常用的调整RDD分区的算子

  1. repartition:将RDD重新划分为指定的分区数量(会触发shuffle操作)。
    val repartitionedRDD = rdd.repartition(10)
    
  2. coalesce:减少RDD的分区数量,尽量避免shuffle(适用于缩小分区的场景)。
    val coalescedRDD = rdd.coalesce(5)
    
  3. partitionBy:用于对键值对RDD进行重新分区(例如在reduceByKey之前设置自定义分区器)。
    val partitionedRDD = rdd.partitionBy(new HashPartitioner(10))
    

为什么不推荐调整RDD的分区数量

  • 手动调整RDD分区(尤其是通过repartition)会引发shuffle操作,导致额外的网络传输开销,影响性能。
  • RDD分区调整可能会干扰内存迭代管道的构建,降低Spark作业的执行效率。

集群中并行度的规划

为了充分利用集群资源,特别是CPU的计算能力,通常我们建议并行度的设置为集群总CPU核心数的2到10倍

规划并行度,只看集群总CPU核数

为什么至少要设置为2倍?

  • 每个CPU核心在同一时间只能执行一个Task。如果并行度设置为与CPU核心数量相等,虽然CPU能被完全利用,但一旦某些Task提前完成,就会导致CPU出现闲置状态,降低资源利用率。

  • 设置并行度为核心数的2倍或更多,可以确保每当一个Task执行完毕时,另一个Task能立刻开始,避免CPU核心空闲,从而最大化利用CPU资源。

确保是CPU核心的整数倍即可,最小是2倍,最大一般10倍或更高(适量)均可

设置并行度过高的影响

  • 虽然设置更高的并行度能充分利用CPU资源,但过高的并行度会导致Task数量过多,进而增加调度和任务切换的开销,反而可能对性能不利。
  • 因此,通常推荐设置为CPU核心数的2到10倍,具体取决于作业的复杂性和资源利用情况。

  1. 并行度决定了同时运行的Task数量,直接影响作业的执行效率和集群资源利用率。
  2. 全局并行度设置spark.default.parallelism)是推荐的方式,可以通过配置文件、客户端参数或代码进行设置。
  3. 针对RDD的分区调整(如repartitioncoalesce等)不推荐,除非在特定情况下需要,否则会引发shuffle操作,增加开销。
  4. 并行度规划:建议设置为CPU核心数的2~10倍,可以最大限度地利用集群资源,同时避免资源浪费和调度开销。