web-dev-qa-db-ja.com

StreamingContextの開始が「IllegalArgumentException:要件の失敗:出力操作が登録されていないため、何も実行しない」で失敗するのはなぜですか?

次のように、Spark Twitterをソースとして使用したスト​​リーミングの例を実行しようとしています。

public static void main (String.. args) {

    SparkConf conf = new SparkConf().setAppName("Spark_Streaming_Twitter").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);       
        JavaStreamingContext jssc = new JavaStreamingContext(sc, new Duration(2));      
        JavaSQLContext sqlCtx = new JavaSQLContext(sc);     


        String[] filters = new String[] {"soccer"};

        JavaReceiverInputDStream<Status> receiverStream = TwitterUtils.createStream(jssc,filters);



         jssc.start();
         jssc.awaitTermination();

}

しかし、私は次の例外を受けています

Exception in thread "main" Java.lang.AssertionError: assertion failed: No output streams registered, so nothing to execute
    at scala.Predef$.assert(Predef.scala:179)
    at org.Apache.spark.streaming.DStreamGraph.validate(DStreamGraph.scala:158)
    at org.Apache.spark.streaming.StreamingContext.validate(StreamingContext.scala:416)
    at org.Apache.spark.streaming.StreamingContext.start(StreamingContext.scala:437)
    at org.Apache.spark.streaming.api.Java.JavaStreamingContext.start(JavaStreamingContext.scala:501)
    at org.learning.spark.TwitterStreamSpark.main(TwitterStreamSpark.Java:53)

この問題を修正する方法はありますか?

23
Ananth Duari

出力演算子が呼び出されると、ストリームの計算がトリガーされます。

DStreamに出力演算子がない場合、計算は呼び出されません。基本的に、ストリームで以下のいずれかのメソッドを呼び出す必要があります

print()
foreachRDD(func)
saveAsObjectFiles(prefix, [suffix])
saveAsTextFiles(prefix, [suffix])
saveAsHadoopFiles(prefix, [suffix])

http://spark.Apache.org/docs/latest/streaming-programming-guide.html#output-operations

最初に変換を適用し、必要に応じて関数を出力することもできます。

41
Jigar Parekh

スレッド「メイン」の例外Java.lang.AssertionError:アサーションが失敗しました:出力ストリームが登録されていないため、何も実行されません

TL; DRprintsaveAsTextFilesなどの使用可能な 出力演算子 のいずれかを使用しますforeachRDD(または使用頻度が低いsaveAsObjectFilesまたはsaveAsHadoopFiles)。

つまり、コードの次の行の間で出力演算子を使用する必要があります。

JavaReceiverInputDStream<Status> receiverStream = TwitterUtils.createStream(jssc,filters);
// --> The output operator here <--
jssc.start();

Spark公式ドキュメントの DStreamsでの出力操作 (私のものを強調表示)を引用:

出力操作を使用すると、DStreamのデータをデータベースやファイルシステムなどの外部システムにプッシュできます。出力操作では、実際に変換されたデータを外部システムで使用できるため、すべてのDStream変換の実際の実行をトリガーします(RDDのアクションと同様)

ポイントは、出力演算子がないと「出力ストリームが登録されていないため、何も実行しない」です。

あるコメンターが気づいたように、出力変換を使用する必要があります。 printを開始する前のforeachRDDまたはStreamingContext


内部的には、使用可能な出力演算子のいずれかを使用するときはいつでも、たとえばprintまたはforeachDStreamGraph出力ストリームを追加 が要求されます。

新しいForEachDStreamが作成および登録される の後に登録を見つけることができます(これは 出力ストリームとして追加する に対して正確です)。

2
Jacek Laskowski

また、-wrongly-はこの問題を非難することに失敗しますが、実際の原因非複数の数値です=ストリーミング入力からのスライドウィンドウ期間とRDD時間ウィンドウの間。 警告のみを記録します:修正すると、コンテキストの失敗が停止します:D

1
user1995400