关于Spark默认并行度spark.default.parallelism的理解

Spark的默认并行度(defaultParallelism)是指RDD的分区数,它影响任务的并行执行。在无明确分区设定时,reduceByKey和join等shuffle操作的reduce端按此值设定分区。在local模式下,它取决于CPU核数;在集群模式如Standalone、Yarn,它基于executor的总核数。默认并行度并不一定是最终的RDD分区数,具体还需考虑数据集大小等因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spark.default.parallelism是指RDD任务的默认并行度,Spark中所谓的并行度是指RDD中的分区数,即RDD中的Task数。

当初始RDD没有设置分区数(numPartitions或numSlice)时,则分区数采用spark.default.parallelism的取值。

Spark作业并行度的设置代码如下:

val conf = new SparkConf()
  .set("spark.default.parallelism", "500")

对于reduceByKey和join这些分布式shuffle算子操作,其reduce端的stage默认取spark.default.parallelism这个配置项的值作为分区数,如果没有配置,则以map端的最后一个RDD的分区数作为其分区数,那么分区数就决定了reduce端的task的个数。

对于没有shuffle的算子,假设没有执行repartition和coalesce算子进行重分区,则分区个数不变,即RDD的分区数和父RDD的分区数相同。

对于没有父RDD的的算子,在创建RDD又没有设置分区数时,比如parallelize(或makeRDD),默认并行度依赖Spark运行的模式。

(1)local模式

默认并行度取决于本地机器的核数,即

  • local: 没有指定CPU核数,则所有计算都运行在一个线程当中,没有任何并行计算
  • local[K]:指定使用K个Core来运行计算,比如local[2]就是运行2个Core来执行
  • local[*]: 自动帮你按照CPU的核数来设置线程数。比如CPU有4核,Spark帮你自动设置4个线程计算。

(2)集群模式

集群模式包含Stanalone、Yarn模式,Mesos的默认并行度为8

默认并行度取决于所有executor上的总核数与2的最大值,比如集群模式的设置如下:

--num-executors 5
--executor-cores 2

上面配置Executor的数量为5,每个Executor的CPU Core数量为2,executor上的总核数10,则默认并行度为Max(10,2)=10

注意,上面只是默认并行度(defaultParallelism)的取值,并不一定是RDD最终的分区数。具体来说,对于从集合中创建的RDD,其最终分区数等于defaultParallelism,但是从外部存储系统的数据集创建创建的RDD,其最终的分区数需要文件的总大小计算得到。

下面给出官方对于spark.default.parallelism的解释

Meaning(含义)

Default number of partitions in RDDs returned by transformations like join, reduceByKey, and parallelize when not set by user.

Default(默认值)

For distributed shuffle operations like reduceByKey and join, the largest number of partitions in a parent RDD. For operations like parallelize with no parent RDDs, it depends on the cluster manager:

  • Local mode: number of cores on the local machine
  • Mesos fine grained mode: 8
  • Others: total number of cores on all executor nodes or 2, whichever is larger
### 设置 Spark 默认并行度为 400 的方法 在 Spark 中,可以通过多种方式设置默认并行度(`default parallelism`)。以下是几种常见的配置方法: #### 方法一:通过 `spark.default.parallelism` 参数 可以在 Spark 配置文件或启动应用程序时指定该参数来设置全局默认并行度。具体操作如下: - 如果使用的是 Spark Shell 或其他交互环境,在启动命令中加入以下选项即可完成配置: ```bash --conf spark.default.parallelism=400 ``` - 对于集群模式下的作业提交,也可以通过 `--conf` 参数传递给 `spark-submit` 工具[^1]。 #### 方法二:修改 Spark 配置文件 对于长期运行的任务或者固定部署场景,可以编辑 Spark 的配置文件 `spark-defaults.conf` 并添加以下内容: ```properties spark.default.parallelism 400 ``` 保存更改后重启 Spark 应用程序以使新配置生效[^3]。 #### 方法三:动态调整 Shuffle 分区数量 除了上述静态设定外,还可以针对特定任务灵活控制其分区数目。例如当执行 SQL 查询语句前可临时改变 shuffle partitions 数量至目标值 (此处设为400),即执行下面这条指令之前的所有后续shuffle操作都将采用新的定义好的partition count: ```sql SET spark.sql.shuffle.partitions=400; ``` ### 处理与优化性能问题 即使设置了较高的初始并行级别也可能遇到某些特殊情况比如数据分布不均等问题影响整体效率表现。此时就需要借助更高级别的特性来进行进一步微调: #### 开启自适应查询执行(AQE) 启用 AQE 功能可以帮助系统自动识别潜在的数据倾斜状况并对之采取相应措施而无需人工干预过多细节部分。主要涉及以下几个关键参数调节: - **开启AQE**: 将 `spark.sql.adaptive.enabled=true` 添加到您的应用配置当中去激活整个机制。 - **处理倾斜连接** : 启用 skew join 自动检测和缓解策略,确保相关联表间存在显著差异大小关系时候能够有效应对可能出现的大规模重复计算现象. * 设定阈值判断标准:`spark.sql.adaptive.skewJoin.skewedPartitionFactor`=X(推荐保持原厂预设5不变除非特殊需求); * 明确触发条件界限: `spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes`=Y字节单位表示达到多少容量以上才被认定属于严重失衡范畴值得特别对待. 这些做法共同作用之下往往能带来较为明显的提速效果同时减少资源浪费情况发生概率[^4]. ### 示例代码片段展示如何初始化带有定制化属性的对象实例 ```scala import org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession val conf = new SparkConf() .setAppName("CustomParallelismApp") .setMaster("local[*]") .set("spark.default.parallelism", "400") val spark = SparkSession.builder.config(conf).getOrCreate() // 执行业务逻辑... println(s"Current default parallelism is set to ${spark.conf.get("spark.default.parallelism")}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷恩Layne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值