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

PySpark Join两个10GB宽表时触发java.lang.StackOverflowError报错

问题现象

对两份单份大小10GB的相同数据集执行Join操作时抛出栈溢出错误,同逻辑代码在小数据集测试场景下可正常运行。

基础环境信息
  • 数据集属性:单表包含约701列
  • Spark配置参数:
    • Driver内存:2GB,Driver核数:2
    • Executor内存:19GB,单Executor核数:5,Executor总数:4
复现代码
df1=spark.read.format("csv").option("header",True).option("inferSchema",True).load(input_path)
df2=spark.read.format("csv").option("header",True).option("inferSchema",True).load(input_path)
outputDf=join(df1,df2) # 自定义join逻辑
print(outputDf.count())
核心报错日志
2022-06-27T15:50:27.799360066Z : java.lang.StackOverflowError
2022-06-27T15:50:27.799431009Z  at org.apache.spark.sql.catalyst.trees.TreeNode.$anonfun$mapChildren$1(TreeNode.scala:438)
2022-06-27T15:50:27.799438757Z  at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:244)
2022-06-27T15:50:27.799443294Z  at org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:406)
2022-06-27T15:50:27.799447490Z  at org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:359)
问题根因

该栈溢出报错发生在Driver端的执行计划解析阶段,和Executor侧内存资源无关。Spark SQL的Catalyst优化器处理逻辑时,会递归遍历语法树的所有节点,本次场景中单表列数达701,Join后生成的宽表节点数翻倍,递归深度直接超出JVM默认1MB栈空间的承载上限,触发栈溢出。小数据集场景下若列数少、语法树深度低,自然不会触发该问题。另外当前Driver内存仅配置2GB,本身也不足以支撑超宽表的Schema解析、执行计划生成的内存开销,属于配置短板。

解决方案

按优先级从高到低操作即可解决问题:

  • 调大Driver端JVM栈深度:提交Spark任务时增加配置--conf spark.driver.extraJavaOptions="-Xss16m",将默认1MB的栈容量提升到16MB,足够支撑千列级表的执行计划递归遍历需求。
  • 提升Driver内存规格:将spark.driver.memory从2GB调整到8GB及以上,超宽表的Schema解析、执行计划优化、任务调度全流程都在Driver端执行,2GB内存很容易触发GC开销超限甚至OOM问题。
  • 移除CSV读取的inferSchema配置:inferSchema会强制Driver先全量扫描输入文件推断每列数据类型,会额外消耗大量Driver内存和栈资源,建议提前定义好表Schema,通过.schema()方法传入读表逻辑,可大幅降低Driver端负载。
  • 可选优化:如果调整上述配置后仍偶发栈溢出,可增加配置--conf spark.sql.optimizer.nestedSchemaPruning.enabled=false,关闭嵌套结构剪枝优化,降低执行计划生成阶段的树遍历深度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:57:19