PySpark on Yarn运行报错:Cannot call methods on a stopped SparkContext
"Cannot call methods on a stopped SparkContext" 报错分析与解决
报错原因
- Yarn空闲资源回收机制:Yarn集群会对长时间无任务执行的Spark应用进行资源回收。你的代码中调用
time.sleep(10)让应用处于完全空闲状态,超过Yarn默认的空闲超时阈值后,Yarn会主动停止SparkContext以释放资源。 - Spark/Yarn超时配置不合理:默认的空闲超时参数可能过短,无法支撑测试用的sleep时长,导致上下文被提前终止。
- 潜在的资源申请问题:如果指定的Yarn队列(
root.larva_growth_intelligence)不存在或无可用资源,Spark应用可能启动后因无法获取资源而快速终止上下文。
解决方法
1. 调整超时配置,延长空闲容忍时间
在SparkConf中添加超时相关参数,避免Yarn过早回收资源:
conf = SparkConf() \ .setAppName("lihai.2") \ .set("spark.hadoop.yarn.cluster.name", CLUSTER) \ .set("spark.yarn.queue", QUEUE) \ # 延长ApplicationMaster空闲超时时间(单位:毫秒,示例设置为30秒) .set("spark.yarn.appMasterIdleTimeout", "30000") \ # 延长Executor空闲超时时间 .set("spark.executor.idleTimeout", "30000")
2. 避免无意义的长时间空闲
如果测试不需要强制sleep,直接移除time.sleep(10);如果必须等待,可在等待期间执行轻量操作保持上下文活跃,比如:
import time # 替代sleep,每隔1秒执行一次轻量操作 for _ in range(10): spark.sparkContext.parallelize([1]).count() time.sleep(1) spark.createDataFrame([[1,2,3], [4,5,6]])
3. 显式检查并重建SparkContext
在执行核心操作前检查上下文状态,若已停止则重新创建:
import time time.sleep(10) # 检查SparkContext是否已停止 if spark.sparkContext.isStopped(): # 重新创建SparkSession spark = SparkSession \ .builder \ .master("yarn") \ .config(conf=conf) \ .enableHiveSupport() \ .getOrCreate() spark.createDataFrame([[1,2,3], [4,5,6]])
4. 验证Yarn配置正确性
确认指定的集群名称(topi)和队列(root.larva_growth_intelligence)在Yarn集群中存在且有可用资源,避免因资源申请失败导致上下文异常终止。
内容的提问来源于stack exchange,提问作者fkjslee
相关产品推荐
相关产品推荐

