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

PySpark连接Cassandra执行show()时触发StackOverflowError问题

PySpark读取大分区Cassandra表触发StackOverflowError的解决

问题背景

处理一张含约3000万条数据的Cassandra表(分区规模较大),尝试用PySpark对接以缩短读取时间,但调用data_frame.show()时触发StackOverflowError;读取同数据的CSV文件操作正常,排除数据量本身的问题。

环境配置

  • Cassandra集群:3个节点,副本因子RF=3,每个节点配备20核CPU、1TB SSD、64GB内存
  • Spark连接器版本:com.datastax.spark:spark-cassandra-connector_2.12:3.1.0

代码片段

初始启动PySpark的命令:

bin/pyspark --packages com.datastax.spark:spark-cassandra-connector_2.12:3.1.0

读取Cassandra表的Python代码:

hosts = {
    "spark.cassandra.connection.host": 'node1_ip,node2_ip,node3_ip',
    "table": "ex_table",
    "keyspace": "ex_keyspace"
}
data_frame = sqlContext.read.format("org.apache.spark.sql.cassandra") \
    .options(**hosts).load()

错误详情

执行data_frame.show()后抛出错误:

>>> hosts ={"spark.cassandra.connection.host":"10.0.0.10,10.0.0.11,10.0.0.12","table":"dummy_table","keyspace":"dummy_keyspace"}
>>> data_frame=sqlContext.read.format("org.apache.spark.sql.cassandra").options(**hosts).load()
>>> data_frame.show() 
Traceback (most recent call last):   File "<stdin>", line 1, in <module>   File
"/home/pc3/spark/python/pyspark/sql/dataframe.py", line 494, in show
    print(self._jdf.showString(n, 20, vertical))   File "/home/pc3/spark/python/lib/py4j-0.10.9.3-src.zip/py4j/java_gateway.py",
line 1321, in __call__   File
"/home/pc3/spark/python/pyspark/sql/utils.py", line 111, in deco
    return f(*a, **kw)   File "/home/pc3/spark/python/lib/py4j-0.10.9.3-src.zip/py4j/protocol.py",
line 326, in get_return_value py4j.protocol.Py4JJavaError: An error
occurred while calling o52.showString. :
org.apache.spark.SparkException: Job aborted due to stage failure:
Task serialization failed: java.lang.StackOverflowError
java.lang.StackOverflowError  at
java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1190)
...(省略重复栈信息)

运行时内存未达上限,但有单个核心使用率达80%-90%。

解决方案

修改PySpark启动命令,增加spark.driver.extraJavaOptions=-Xss16m配置扩大Java线程栈大小:

./bin/pyspark --packages com.datastax.spark:spark-cassandra-connector_2.12:3.1.0 --conf spark.driver.extraJavaOptions=-Xss16m

调整后问题解决。

原因说明

StackOverflowError的核心原因是Java线程栈空间不足。由于Cassandra表的分区规模较大,Spark在处理这类数据的序列化/反序列化流程时,默认的线程栈空间无法容纳复杂的调用栈,进而触发栈溢出。通过-Xss16m参数扩大线程栈大小后,能够支撑大分区数据的处理流程,解决该错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:45:37