2017-05-18 10 views
3

次の2との違いは何ですか?SparkSessionが閉じられていないとどうなりますか?

object Example1 { 
    def main(args: Array[String]): Unit = { 
     try { 
      val spark = SparkSession.builder.getOrCreate 
      // spark code here 
     } finally { 
      spark.close 
     } 
    } 
} 

object Example2 { 
    val spark = SparkSession.builder.getOrCreate 
    def main(args: Array[String]): Unit = { 
     // spark code here 
    } 
}  

私は、SparkSessionがCloseableを実装していることを知っており、それを閉じる必要があることを知っています。しかし、SparkSessionがExample2のように作成されただけで、決して直接クローズしないと、私は何の問題も考えることができません。 Sparkアプリケーションが正常に終了した場合(メインメソッドを終了した場合)、JVMは終了し、SparkSessionは終了します。これは正しいです? IMO:SparkSessionがシングルトンであるという事実は、大きな違いをもたらすべきではありません。

答えて

1

あなたが(最終的な結果は、ちょうどあなたが与えられていたもの恩返しの良い練習に従うことであったとしても)、その使用して行われたときにあなたは常にあなたSparkSessionを閉じる必要があります。

SparkSessionを閉じると、他のアプリケーションに与えることができるクラスタリソースが解放される可能性があります。

SparkSessionはセッションであり、JVMメモリを消費するリソースを維持します。必要な数のSparkSessionを用意することができます(セッションを新しく作成するにはSparkSession.newSessionを参照してください)。使用しない場合は不要なメモリを使用しないようにしてください。不要なものはcloseです。

SparkSessionは周りのSQLのラッパースパークスパークコアのSparkContext、あなたは(SparkContextを通じて)あなたのSparkSessionに割り当てられたクラスタリソース、すなわちvcoresとメモリを、持っていると思いますので、カバーの下に(任意のスパークアプリケーションのように)。つまり、SparkContextが使用されている場合(SparkSessionを使用)、クラスタリソースは他のタスクに割り当てられません(必ずしもSparkのものではなく、クラスタに送信された他のSpark以外のアプリケーションの場合も同様です)。これらのクラスターリソースは、あなたが「完了しました」と答えるまではあなたのものです... close

closeの後では、単にSparkアプリケーションを終了すると、リソースは自動的に閉じられるため、closeを実行する必要はありません。ドライバとエグゼキュータのJVMは終了し、クラスタへの(ハートビート)接続も終了し、最終的にリソースはクラスタマネージャに戻され、他のアプリケーションで使用できるようになります。

+0

私が間違っていてもスパークアプリケーションが成功するか失敗するかを修正してください。いずれの場合も、Sparkアプリケーションは終了し、関連するJVMも終了します。 JVMが終了すると、すべてのリソースが解放されます(私が閉じるかどうかにかかわらず)。また、 'getOrCreate()'を使うと、SparkSessionはシングルトンではありませんか? 「あなたはSparkSessionsを好きなだけたくさん持てますか?」とはどういう意味ですか?ありがとう! – Gevorg

+0

ここでは2つの質問があります:最終結果にかかわらず - 失敗または成功 - 最終的には、スコアとメモリがクラスタ上で解放され、利用可能になります。2) 'SparkSession' **がシングルトンであるため、 spark.newSessionを実行して他のセッションと分離することもできます。 –

関連する問題