使用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")
,但似乎无济于事。
有人知道如何正确设置此属性吗?
答案 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
结尾,并在下一次使用新的。