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

Spark UI中Exchange作用、分区数含义及推理验证

Spark分区与UI显示相关问题解答

操作与现象说明

我正在学习Spark,执行了以下操作:
创建4分区的DataFrame:

ids = spark.range(1,9,1,4)

随后通过repartition(col("id") % 2)重新分区得到新DataFrame。查看q.rdd.toDebugString()发现MapPartitionsRDD为4分区,而Spark UI中Exchange阶段显示200分区(默认spark.sql.shuffle.partitions值),但后续ShuffledRowRDD仅1分区。

推理正确性判断

推理1:若MapPartitionsRDD为200分区,应处于独立Stage且名称非MapRDD;

正确。MapPartitionsRDD是基于父RDD分区做转换的类型,不会触发Shuffle。要生成200分区的RDD,必须通过Shuffle(Exchange阶段)生成新分区集,这会形成独立Stage,且对应的RDD会是Shuffle相关类型(比如ShuffledRowRDD),而非MapPartitionsRDD。

推理2:ShuffledRowRDD为1分区是Spark自适应查询执行的合并操作导致;

正确。Spark自适应查询执行(AQE)的合并小分区特性,会在Shuffle后自动合并数据量极小的分区,减少后续任务数。这里id % 2仅产生0、1两个分组,但总数据量只有8条,AQE会把这些小分区合并成1个。如果关闭AQE(设置spark.sql.adaptive.enabled=false),ShuffledRowRDD会是2个分区(对应两个分组),而非200个——因为repartition(col("id")%2)是哈希分区,实际分区数不会超过分组数,spark.sql.shuffle.partitions只是Shuffle的最大分区数上限。

推理3:Spark UI中显示的分区数与RDD分区无关,分区和Shuffle在两Stage间完成;

错误。Spark UI的分区数和RDD分区强相关:Exchange阶段显示的200分区是Shuffle的预期目标分区数(由spark.sql.shuffle.partitions控制),但实际执行时AQE会调整最终的RDD分区数(也就是ShuffledRowRDD的1分区)。Shuffle确实在两个Stage之间完成,但UI里的分区数就是对应Stage中任务的分区数,直接关联该Stage对应的RDD分区。

相关UI问题解答

Spark UI中Exchange的作用是什么?

Exchange是Spark SQL对Shuffle操作的抽象阶段,负责将上游Stage的数据按指定规则(哈希、范围等)重新分配,实现数据的重新分区,让下游Stage的任务能获取到符合计算需求的分区数据,本质就是SQL层面对RDD Shuffle逻辑的封装。

Spark UI SQL区的分区数代表什么?

Spark UI SQL区的分区数,对应对应阶段(Stage)中并行执行的任务数量,每个任务处理一个数据分区:

  • 对于Exchange(Shuffle)阶段,显示的是Shuffle的目标分区数(默认由spark.sql.shuffle.partitions控制),开启AQE后实际执行的分区数可能会被调整;
  • 对于普通计算阶段,分区数等于该阶段对应RDD的分区数,每个任务对应一个RDD分区的处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:35:12