你应该如何在if语句中结束Spark工作?

时间:2017-12-09 00:08:27

标签: scala apache-spark

在条件语句中结束spark作业的推荐方法是什么?

我正在对我的数据进行验证,如果错误,我想优雅地结束火花工作。

现在我有:

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;
var _tempMediaFolder = await picturesFolder.CreateFolderAsync("media", CreationCollisionOption.OpenIfExists);
IReadOnlyList<StorageFile> storageFilesOperation = await _tempMediaFolder.GetFilesAsync();

foreach(StorageFile f in storageFilesOperation)
{
    await f.DeleteAsync();
}

但是,我收到以下错误:

if (isValid(data)) {
    sparkSession.sparkContext.stop()
}

然后它显示了一个堆栈跟踪。

Exception in thread "main" java.lang.IllegalStateException: SparkContext has been shutdown 不是正确结束点火工作的正确方法吗?

2 个答案:

答案 0 :(得分:0)

一旦停止SparkSession意味着,您的SparkContext将在JVM上被终止。 sc现在不再有效了。

因此,您无法调用任何与sparkContext相关的对象/函数来创建RDD / Dataframe或其他任何内容。 如果你在程序流程中再次调用相同的sparksession ..你应该找到上面的例外。 例如。

`    val rdd=sc.parallelize(Seq(Row("RAMA","DAS","25"),Row("smritu","ranjan","26")))
    val df=spark.createDataFrame(rdd,schema)
    df.show()   //It works fine
    if(df.select("fname").collect()(0).getAs[String]("fname")=="MAA"){
    println("continue")
    }
    else{
    spark.stop()   //stopping sparkSession
    println("inside Stopiing condition")
    }
    println("code continues")
    val rdd1=sc.parallelize(Seq(Row("afdaf","DAS","56"),Row("sadfeafe","adsadaf","27")))
    //Throws Exception...
    val df1=spark.createDataFrame(rdd1,schema)
    df1.show()
`

答案 1 :(得分:0)

没有什么可说的,你不能在stop声明中调用if,但没有理由这样做,这可能是错误的。您的问题似乎暗示您可能正在尝试打开多个Spark会话。

Spark会话打算在程序的生命周期内保持打开状态 - 如果你尝试启动两个,你会发现Spark抛出异常并打印一些背景,包括一个讨论主题的JIRA票据到日志。

如果您希望运行多个Spark任务,可以将它们提交到相同的上下文。一个上下文可以同时运行多个任务。