当使用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();
    }


我希望无论有多少连续失败,它都会不断尝试,但看起来好像我没有正确应用参数。

我还尝试设置-13"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/

10-10 07:34