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

Glue作业保存Parquet文件时出现java.lang.StackOverflowError求助

解决Glue作业保存Parquet时的java.lang.StackOverflowError错误

问题原因

你的DataFrame包含250列属于超宽表,Spark生成查询计划时会递归遍历QueryPlan树,列数过多导致递归深度超出JVM栈内存限制,触发StackOverflowError。报错日志中重复出现的QueryPlan.rewrite$1和TreeNode.mapChildren调用,正是递归遍历计划树时栈耗尽的典型表现。

解决办法

1. 调整JVM栈内存参数

在Glue作业配置中增加JVM栈大小,为递归操作预留足够空间:

  • 进入Glue作业的Job parameters设置
  • 添加以下配置参数:
    --conf spark.driver.extraJavaOptions=-Xss4m
    --conf spark.executor.extraJavaOptions=-Xss4m
    
    注:-Xss4m表示将栈大小设为4MB,默认栈大小通常为1MB,可根据实际情况调整至8MB以内,过大可能引发内存溢出。

2. 优化DataFrame列处理逻辑

若调整栈参数后问题仍存在,尝试简化查询计划复杂度:

  • 拆分宽表:将250列按业务逻辑拆分为多个小DataFrame分别保存,后续需合并时再进行关联操作
  • 清理冗余操作:检查transform_to_column_based_format方法,移除不必要的列转换、重复select等操作,尽量简化查询计划
  • 启用Parquet写入优化:保存时确认启用spark.sql.parquet.writeLegacyFormat=false(默认已启用),使用现代Parquet写入逻辑降低计划树复杂度

3. 升级Glue/Spark版本

旧版本Spark(如你当前使用的Py4J 0.10.9对应Spark版本)在超宽表处理上存在递归栈溢出的已知问题,升级至Glue 3.0及以上版本(对应Spark 3.1+),官方已修复大量宽表递归处理的栈溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:55:23