当使用SparkSession加载/写入某些数据时发生连续几次失败时,Spark最终将停止工作,并立即返回“无法在已停止的SparkContext上调用方法”,无论可能的结果如何。
经过研究,我在spark's documentation上发现了“ spark.deploy.maxExecutorRetries”,其中指出:
如果应用程序经历的时间超过spark.deploy.maxExecutorRetries
连续出现故障,没有执行程序成功地在这些执行程序之间运行
失败,并且应用程序没有正在运行的执行程序,那么独立
集群管理器将删除该应用程序并将其标记为失败。至
禁用此自动删除,请将spark.deploy.maxExecutorRetries设置为-1。
所以我尝试了这个:
public static SparkSession getNewSparkSession() {
return SparkSession.builder().appName("SparkJdbcSuite").master("local[*]").config("spark.deploy.maxExecutorRetries", "-1").getOrCreate();
}
我希望无论有多少连续失败,它都会不断尝试,但看起来好像我没有正确应用参数。
我还尝试设置
-1
,3
,"3"
,并使用SparkConf,set("spark.deploy.maxExecutorRetries", "-1")
,但似乎没有任何效果。有人知道如何正确设置此属性吗?
最佳答案
通过执行以下操作解决了该问题:
SparkConf config = new SparkConf().setMaster("local[*]").setAppName("SparkContext");
SparkContext context = SparkContext.getOrCreate(config);
return SparkSession.builder().sparkContext(context).getOrCreate();
并在使用spark之后将其添加到
finally
块中:SparkSession session = sparkSession.get();
session.sparkContext().stop();
session.close();
看起来SparkSession试图使用停止的上下文,这样,它总是得到一个新的上下文,除非它正在执行某些操作。但是,如果
Cannot call methods on a stopped SparkContext
发生,它将以stop
结尾,并在下次使用新的。关于java - 在SparkSession上设置maxExecutorRetries,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57467532/