如何查看Spark Shuffle的中间结果?含读写阶段结果形态查看方法
如何查看Spark Shuffle的中间结果及了解其中间形态
Shuffle Write与Read之间的中间结果形态
Shuffle Write输出形态
- Map任务完成后,数据会按指定的分区器(如HashPartitioner、RangePartitioner)拆分,写入本地磁盘的二进制序列化文件,默认使用Java序列化或Kryo序列化格式,存储Key-Value对。
- 每个Map任务会生成N个数据文件(N等于Reduce任务的数量),同时生成对应的索引文件(
.index后缀),记录每个分区数据在数据文件中的偏移量,方便Reduce任务精准拉取。
Shuffle Read拉取后的中间形态
- Reduce任务从各个Map节点拉取对应分区的数据,先存入内存缓冲区;当缓冲区达到阈值(由
spark.shuffle.memoryFraction等参数控制),会溢写到本地磁盘形成临时文件。 - 拉取完成后,若使用SortShuffleManager(默认),会对所有拉取的数据进行排序;若用HashShuffleManager,则直接合并相同Key的数据,最终形成可供后续算子处理的结构化数据集。
中间结果的查看方法
1. 直接查看本地Shuffle文件
- 定位存储路径:Shuffle文件默认存在
spark.local.dir配置的目录,未指定时会使用系统临时目录(如Linux的/tmp/spark-*)。 - 识别文件命名:数据文件命名规则为
shuffle_<shuffleId>_<mapId>_<reduceId>.data,对应索引文件为shuffle_<shuffleId>_<mapId>_<reduceId>.index。 - 解析序列化内容:直接打开是乱码,可通过Spark自带的API解析:比如用
sc.sequenceFile[K, V]("文件路径")读取(若为SequenceFile格式),或编写简单的Scala/Java程序,用Spark的序列化器(如Kryo)反序列化文件内容。
2. 通过Spark UI查看统计信息
- 访问Spark UI(默认端口4040),进入Stages页面,找到目标Shuffle阶段:
- 查看
Shuffle Write Size/Records:了解每个Map任务写入的数据量和记录数 - 查看
Shuffle Read Size/Records:了解每个Reduce任务拉取的数据规模 - 点击单个Task的详情,可查看Shuffle溢出次数、排序耗时等细节,间接判断中间结果的处理状态。
- 查看
3. 代码调试中查看样本数据
- 在Shuffle前后的算子中添加日志:比如在
map算子后加foreach(record => if(record._1.equals("目标Key")) println(record)),只打印指定样本,避免全量输出导致性能问题。 - 小规模测试时,可将Shuffle前的数据
cache后,调用collect()拉取到Driver端查看,但仅适合小数据集,生产环境禁止使用,防止OOM。
4. 查看Shuffle Read的溢写磁盘文件
- 当Shuffle Read内存不足时,溢写的临时文件存在
spark.local.dir下的shuffle/spill目录,同样为序列化格式,需用Spark序列化器解析。 - 可通过Spark UI的Storage页面查看Shuffle缓存的内存数据大小及使用情况。
内容的提问来源于stack exchange,提问作者lim-yoona
相关产品推荐
相关产品推荐

