2016-10-03 13 views
2

私は基本的に私のデータフレームで実行する2つの保存アクションを持っています。仕事はうまく動いています。しかし、Spark UIでイベントのタイムラインを見ると、最初のAction 1が完了し、Action 2が開始して完了することが分かります。sparkで2つの書き込みアクションをトリガーする方法

これらの2つのアクションは互いに独立しているため、それらを一緒に実行する方法はありますか。以下は私のコードです。

processedDF.write.format("ORC").options(Map("path" -> 
integrationFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." 
+ hiveTableName + "_int") 
errorDF.write.format("ORC").options(Map("path" -> 
errorFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." + 
hiveTableName + "_error") 

「processDF」と「errorDF」の両方をHDFSに同時に書き込みたいとします。

答えて

1

あなたは別のスレッドでこれらを起動することができます。

new Thread() { 
     override def run(): Unit = { 
     processedDF.write.format("ORC").options(Map("path" -> 
integrationFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." 
+ hiveTableName + "_int") 
     } 
    }.start() 



    new Thread() { 
      override def run(): Unit = { 
      errorDF.write.format("ORC").options(Map("path" -> 
errorFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." + 
hiveTableName + "_error") 
      } 
     }.start() 
0

スケジューリングのドキュメントhereを参照してください。関連セクションをそのまま再現:与えられたスパークアプリケーション(SparkContextインスタンス)の内側に

を彼らは別のスレッドから提出された場合には、複数の並列ジョブを同時に実行することができます[...]デフォルトでは、スパークのスケジューラは、FIFO内のジョブを実行しますファッション。各ジョブは「ステージ」に分かれており(例:マップとフェーズを減らす)、最初のジョブは使用可能なすべてのリソースに優先順位を与え、ステージには起動するタスクがあり、次に2番目のジョブは優先順位を取得します。 Spark 0.8では、ジョブ間の公平な共有を構成することもできます。公平な共有の下で、Sparkはジョブ間で「ラウンドロビン」方式でタスクを割り当てます。その結果、すべてのジョブがほぼ同等のクラスターリソースを占めるようになります。これは、長いジョブが実行されている間に提出された短いジョブはすぐにリソースを受け取ることができ、長いジョブが完了するのを待つことなく、良好な応答時間を得ることができることを意味します。

val conf = new SparkConf().setMaster(...).setAppName(...) 
conf.set("spark.scheduler.mode", "FAIR") 
val sc = new SparkContext(conf) 
:SparkContextを設定するとき

が公正スケジューラを有効にするには、単にFAIRにspark.scheduler.modeプロパティを設定
関連する問題