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
相关产品推荐
相关产品推荐

