在SparkSession上设置maxExecutorRetries

时间:2019-08-12 19:58:09

标签: java apache-spark

使用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"),但似乎无济于事。

有人知道如何正确设置此属性吗?

1 个答案:

答案 0 :(得分:0)

通过以下方法解决了该问题:

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结尾,并在下一次使用新的。