Spark窗口操作单任务Shuffle耗时过长,疑数据倾斜求解
Spark窗口操作单任务Shuffle耗时过长问题分析与优化咨询
问题概述
分析Spark任务指标时发现:尽管整体数据分布相对均匀,但存在单个任务完成时间远高于其他任务的情况,经排查是Shuffle读取时间过长导致。请问这仍属于数据倾斜问题吗?
该问题发生在窗口操作场景下(列名已做隐私修改,含义保留),当前处理规模为1220亿条记录,Executor配置为240个,每个Executor分配10核、60GB内存,内存开销14GB——该配置实践证明比小Executor效果更优。
核心代码
df = (df .withColumn( "duplicate_rank", f.rank().over( Window.partitionBy( "student_id", "student_address_id", "student_thesis_name", ).orderBy( "thesis_chronology_rank", "thesis_start_year", f.col("thesis_end_year").desc(), ) ), ).filter(f.col("duplicate_rank") == 1))
任务耗时指标图

已尝试方案与疑问
- 曾尝试随机加盐(20个桶)并执行两次窗口操作(加盐分区与原分区),但效果不佳。推测原因是所有分区键均为字符串,Shuffle过程中排序开销大,导致数据传输时间过长。
- 测试发现按
student_thesis_name列重分区后,性能大幅提升。但查看物理执行计划时,仅能看到Exchange之后的窗口操作。存在疑问:窗口的分区键包含student_id、student_address_id、student_thesis_name三列,Spark是否仍会在重分区后执行额外的Shuffle?如果是,为何未在物理计划中显示?
内容的提问来源于stack exchange,提问作者bmcristi
相关产品推荐
相关产品推荐

