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

