You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark分区与并行度的关系及默认并行度设置后分区数不符疑问

问题解答

1. 为何设置spark.default.parallelism=3000后分区数不是3000?

spark.default.parallelism的作用范围是RDD shuffle操作、默认并行计算任务,比如reduceByKey、groupBy这类未指定分区数的操作,或是从空RDD生成数据时的分区数,但它无法控制外部数据源读取阶段的分区数量。

当你通过spark.read.json读取S3上的JSON文件时,Spark会依据以下核心参数计算初始分区数:

  • spark.sql.files.maxPartitionBytes:默认值128MB,定义单个分区允许的最大数据量
  • spark.sql.files.openCostInBytes:默认值4MB,用于衡量打开文件的开销,当存在大量小文件时,会合并部分小文件到同一个分区
  • 同时结合S3上JSON文件的总大小、文件数量综合计算

你得到的1150个分区,正是Spark基于上述规则算出的结果,和你设置的spark.default.parallelism完全无关。如果想要让最终分区数达到3000,你可以在读取完成后调用repartition(3000)强制重分区,或者调整上述文件相关的配置参数。

2. Spark中分区与并行度的关系

  • 分区:是数据的物理拆分单位,每个分区对应一个独立的Task(计算任务)。分区的数量直接决定了总任务数,Spark会将不同的分区分配到集群的各个Executor上执行。
  • 并行度:指集群同一时间内能够同时执行的Task数量,它由集群的硬件资源决定——比如集群有3个Executor,每个Executor分配6个CPU核心,那么集群的最大并行度就是18。

举个实际的例子:假设你的RDD有100个分区,但集群最大并行度是20,那么Spark会分5批执行任务,每批同时运行20个Task,直到所有分区处理完成。

另外需要明确:spark.default.parallelism本质是设置默认并行度对应的分区数,当你执行并行操作未指定分区数时,Spark会用这个值作为分区数(比如shuffle后的分区数),但它并非全局强制所有操作都遵循这个数值,像数据源读取这类场景就不适用。

内容的提问来源于stack exchange,提问作者Kudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:33:03