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

在Cloudera Machine Learning中使用PySpark遇ConnectionRefused/OOM错误求助

问题根源与解决方案

问题本质

  • 配置完全冲突:你用master("local[*]")指定Spark运行在本地模式,这种模式下所有计算都在driver进程内完成,不会启动任何独立的executor进程。你配置的spark.executor.instance=10、spark.executor.memory=32g等参数根本无效,反而会干扰Spark的资源管理逻辑。
  • 数据量远超承载极限:70亿行的表关联后调用toPandas(),会把所有结果数据一次性拉到driver节点内存中。就算关联后数据量大幅减少,也绝对超过了你分配的32GB driver内存,直接触发OOM(内存溢出)导致driver进程崩溃,进而引发Py4J连接被拒绝的错误——因为Java端的Spark进程已经挂了,Python自然连不上。

修复步骤

  1. 修正Spark运行模式:在CML环境中,直接删除.master("local[*]")这一行,让CML的集群管理器自动分配资源,Spark会以集群模式运行,真正利用分布式计算能力。
  2. 清理无效配置,优化参数:
    • 删掉spark.executor.instance、spark.executor.memory、spark.executor.cores这些在集群模式下由CML会话管理的参数。
    • 调整spark.sql.shuffle.partitions:400对于70亿行的数据来说太多,建议设置为集群总核数的2-3倍(比如你当前是4核,设为8-12即可),减少shuffle开销。
    • 开启Arrow优化:把spark.sql.execution.arrow.pyspark.enabled设为true,大幅提升PySpark和Pandas之间的数据传输效率。
  3. 避免全量拉取数据:
    • 绝对不要尝试把70亿行关联后的结果全量转成Pandas DataFrame,这完全违背Spark分布式计算的设计初衷。
    • 如果必须用Pandas处理,先通过limit()、sample()或者过滤条件获取小批量数据,再转成Pandas。
    • 优先用Spark SQL完成所有计算逻辑,最后只拉取最终的汇总结果到本地。

内容的提问来源于stack exchange,提问作者Perkūns

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:22:33